标签:
有多种方案可选,其中比较短的是1~5和5~8。后者长度为3最短。
【数据规模】
对于50%的数据, N≤10000;
对于80%的数据, N≤800000;
对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 using namespace std; 10 typedef long long LL; 11 const int maxn=1000010; 12 int N,K,maxpos,cnt; 13 int kin[maxn],a[maxn],next[maxn],head[100],tmp[100]; 14 int ANS=1e9; 15 inline void calc(int pos){ 16 int ans=0; 17 for(int i=1;i<=K;i++){ 18 while(kin[head[i]]>pos){ 19 if(next[head[i]]==0) return ; 20 head[i]=next[head[i]]; 21 } 22 if(kin[head[i]]<=pos) ans=max(ans,pos-kin[head[i]]); 23 } 24 ANS=min(ANS,ans); 25 } 26 int main(){ 27 scanf("%d%d",&N,&K); 28 for(int i=1,t;i<=K;i++){ 29 scanf("%d",&t); 30 for(int j=1,pos;j<=t;j++){ 31 scanf("%d",&pos); maxpos=max(maxpos,pos); 32 kin[++cnt]=pos; a[cnt]=pos;//kin与a记录的是第cnt个彩珠的位置 33 next[cnt]=head[i];//next[cnt]记录与cnt颜色相同的上一个彩珠的序号 34 head[i]=cnt;//更新 head 数组 35 } 36 } 37 sort(a+1,a+cnt+1);//按照位置排序 a[1]~a[N] 表示这 N个彩珠是第几个 38 for(int i=cnt;i>0;i--){ 39 calc(a[i]);//按照位置排好序后从后往前搜,以便更新head数组降低复杂度 40 } 41 printf("%d",ANS); 42 return 0; 43 }
标签:
原文地址:http://www.cnblogs.com/CXCXCXC/p/5077588.html