标签:个数 clu blog stream led 排序 space esc 漂亮
有多种方案可选,其中比较短的是1~5和5~8。后者长度为3最短。
【数据规模】
对于50%的数据, N≤10000;
对于80%的数据, N≤800000;
对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31。
先开始读错题了卡了半天23333
一道单调队列的简单题···注意边界条件就行···先将珠子按照位置排序,维护一个单调队列就好了,过程类似于莫队时的维护答案····注意下边界条件就好了
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<cctype> #include<cstring> #include<string> #include<algorithm> using namespace std; const int N=1e6+5; const int M=105; struct node { int p,c; }b[N]; int n,m,k,queue[N],head,tail,tot,cnt[M],now,ans=0x7f7f7f7f; inline int R() { char c;int f=0; for(c=getchar();c<‘0‘||c>‘9‘;c=getchar()); for(;c<=‘9‘&&c>=‘0‘;c=getchar()) f=(f<<3)+(f<<1)+c-‘0‘; return f; } inline bool cmp(node a,node b) { return a.p<b.p; } int main() { freopen("a.in","r",stdin); n=R(),m=R(); for(int i=1;i<=m;i++) { k=R(); for(int j=1;j<=k;j++) b[++tot].p=R(),b[tot].c=i; } sort(b+1,b+tot+1,cmp); head=tail=1;cnt[b[1].c]++,now=1; for(;head<=tot;head++) { while(now<m&&tail<=tot) { tail++; if(!cnt[b[tail].c]) now++; cnt[b[tail].c]++; } if(tail==tot+1) break; if(now==m) ans=min(ans,b[tail].p-b[head].p); cnt[b[head].c]--; if(!cnt[b[head].c]) now--; } cout<<ans<<endl; return 0; }
标签:个数 clu blog stream led 排序 space esc 漂亮
原文地址:http://www.cnblogs.com/AseanA/p/7598442.html