【题意分析】

给你一条有n个点的数轴,每个点属于一个种类,总共有k个种类。求一段最短的线段,使对于每个种类,这段线段上有至少一个点属于它。

【算法分析】

1.对于50%的数据,N≤10000

对于每一个从左到右枚举的l,从左到右枚举r>=l并不断加入r号彩珠,直到满足条件为止,更新答案。

时间复杂度O(n2)。

2.对于80%的数据,N≤800000

预处理k个种类的前缀和。对于每一个从左到右枚举的l,进行O(klog2n)的二分询问。

时间复杂度O(nklog2n)

3.对于100%的数据,1≤N≤1000000,1≤K≤60,0≤Ti<231

动态维护一个大小为k的离散数组,s[i]表示当前状态下第i个种类的彩珠数。深入考虑算法一,我们发现对于每一个从左到右枚举的l,r是单调不减的。于是固定l时,不断将r号彩珠加入s并右移指针r,直到满足条件为止,更新答案;当l自增时,在s中弹出原l号彩珠,不重置r。这样扫描的时间就是线性的了。

时间复杂度O(nk)

【参考代码】

 #pragma GCC optimize(2)
#include <algorithm>
#include <cstdio>
#include <functional>
#define REP(i,low,high) for(register int i=(low);i<=(high);i++)
using namespace std; //ex_cmp {
template<typename T,class Compare> inline bool getcmp(T &target,const T &pattern,Compare comp)
{
return comp(pattern,target)?target=pattern,:;
}
//} ex_cmp struct beat
{
int kind,pos; void input(const int &K) {kind=K,scanf("%d",&pos);}
bool operator<(const beat &another)const{return pos<another.pos;}
}beats[];
int s[]={}; static int n,k;
inline bool cannot() {REP(i,,k) if(!s[i]) return ; return ;}
int main()
{
scanf("%d%d",&n,&k); int tot=; REP(i,,k)
{
int cnt; for(scanf("%d",&cnt);cnt--;) tot++,beats[tot].input(i);
}
sort(beats+,beats+n+),s[beats[].kind]=; int j=;
for(;j<=n&&cannot();s[beats[j].kind]++) j++; int ans=beats[j].pos-beats[].pos;
REP(i,,n)
{
s[beats[i-].kind]--; for(;j<=n&&cannot();s[beats[j].kind]++) j++;
if(j>n) break; getcmp(ans,beats[j].pos-beats[i].pos,less<int>());
}
return printf("%d\n",ans),;
}

bzoj1293题解的更多相关文章

  1. BZOJ1293:[SCOI2009]生日礼物——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1293 https://www.luogu.org/problemnew/show/P2564#sub ...

  2. BZOJ1293 [SCOI2009]生日礼物 离散化

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1293 题意概括 彩珠有N个,分为K种.每一个彩珠有一个对应的坐标.坐标上可以没有彩珠,多个彩珠也可 ...

  3. 【BZOJ1293】[SCOI2009]生日礼物(单调队列)

    [BZOJ1293][SCOI2009]生日礼物(单调队列) 题面 BZOJ 洛谷 题解 离散之后随便拿单调队列维护一下就好了. #include<iostream> #include&l ...

  4. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  5. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  6. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  7. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  8. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  9. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

随机推荐

  1. php操作redis--有序集合(sorted set)篇

    常用函数:zAdd,zRange,zRem,zCard等. 应用场景:类似集合,可以提供一个优先级的参数来为成员排序,如:分数 连接 $redis = new Redis(); $redis-> ...

  2. Magento多语言注意事项

    Magento一般使用CSV文件方式翻译国际化词条 一般用法是代码中: <?php echo Mage::helper("module_name")->__('Item ...

  3. Array排序和List排序

    public class SortTest { public static void main(String[] args) { int arr[]={12,4,45,23,5,7,9,33}; Sy ...

  4. NX二次开发-MFC对话框获取UG界面句柄,设置MFC对话框在UG界面固定显示位置

    extern "C" DllExport void ufusr(char *param, int *retcod, int param_len) { if (UF_initiali ...

  5. js委托事件-addEventListeners(冒泡方向)

    JQuery中live().delegate().on()事件都能给新增元素绑定事件,原理就是用了事件委托. 实例: 给id为div的元素绑定一个click委托,如果冒泡上来的元素是P元素就会执行al ...

  6. Golang flag包使用详解(一)

    概述 flag包提供了一系列解析命令行参数的功能接口 命令行语法 命令行语法主要有以下几种形式 -flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 以上语法对 ...

  7. Java-Class-E:org.springframework.http.HttpStatus

    ylbtech-Java-Class-E:org.springframework.http.HttpStatus 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部 1. /* * C ...

  8. 使用poi实现生成excel文件

    import java.util.ArrayList; import javax.servlet.ServletOutputStream; import org.apache.poi.hssf.use ...

  9. bigdecimal解决小数间的加减乘除

    public class bigdecimal { public static BigDecimal div(double v1,double v2){ BigDecimal b1=new BigDe ...

  10. 分析由Python编写的大型项目(Volatility和Cuckoo)

    之前使用python都是用来做一些简单的脚本,本质上和bat批处理文件没有区别. 但是Python是可以用来编写大型的项目的,比如: Volatility:https://code.google.co ...