zoukankan      html  css  js  c++  java
  • [bzoj 1293] [SCOI2009]生日礼物

    [bzoj 1293] [SCOI2009]生日礼物

    Description

    小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有N个,分为K种。简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置)。某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上。 小布生日快到了,于是小西打算剪一段彩带送给小布。为了让礼物彩带足够漂亮,小西希望这一段彩带中能包含所有种类的彩珠。同时,为了方便,小西希望这段彩带尽可能短,你能帮助小西计算这个最短的长度么?彩带的长度即为彩带开始位置到结束位置的位置差。

    Input

    第一行包含两个整数N, K,分别表示彩珠的总数以及种类数。接下来K行,每行第一个数为Ti,表示第i种彩珠的数目。接下来按升序给出Ti个非负整数,为这Ti个彩珠分别出现的位置。

    Output

    应包含一行,为最短彩带长度。

    Sample Input

    6 3
    1 5
    2 1 7
    3 1 3 8
    

    Sample Output

    3
    

    HINT

    有多种方案可选,其中比较短的是15和58。后者长度为3最短。
    对于50%的数据, N≤10000;
    对于80%的数据, N≤800000;
    对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31。

    这...是单调队列?好吧,我们姑且建立一个坐标值单调递增的队列.以坐标大小将每个珠子排序,然而用队列模拟就可以了,达到要求后就记录答案.

    #include <cstdio>
    #include <deque>
    #include <algorithm>
    using namespace std;
    
    static const int maxm=1e6+10;
    static const int INF=~(1<<31);
    
    struct point{
    	int x,col;
    	bool operator < (const point &p) const {
    		return x<p.x;
    	}
    }A[maxm];
    
    deque<point>Q;
    
    int color[maxm];
    int n,m,num,cnt,cur,sum;
    int ans=INF;
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++){
    		scanf("%d",&num);int pos;
    		for(int j=1;j<=num;j++){
    			scanf("%d",&pos);
    			A[++cnt].x=pos;A[cnt].col=i;
    		}
    	}
    	
    	sort(A+1,A+n+1);
    	
    	Q.push_front(A[1]);color[A[1].col]=1;sum=1;cur=1;
    	
    	while(!Q.empty()){
    		if(sum==m)ans=min(ans,Q.back().x-Q.front().x);
    		if(sum==m||cur==n){
    			if(!--color[Q.front().col])sum--;
    			Q.pop_front();
    		}else{
    			cur++;
    			if(!color[A[cur].col])sum++;
    			color[A[cur].col]++;
    			Q.push_back(A[cur]);
    		}
    	}
    	
    	printf("%d
    ",ans);
    	
    	return 0;
    }
    

    传送门

  • 相关阅读:
    再见了,正则表达式
    深入理解 Python 描述符
    并发-ScheduledThreadPoolExecutor
    ScheduledExecutorService用法
    常见限流算法总结
    常见集合类的复杂度
    并发-ConcurrentHashMap 1.7和1.8的区别
    并发-HashMap在jdk1.8也会出现死循环
    并发-Hashmap 1.7和1.8有哪些区别
    并发-HashMap与红黑树-todo
  • 原文地址:https://www.cnblogs.com/Exbilar/p/6852455.html
Copyright © 2011-2022 走看看