1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 using namespace std; 6 #define M 1000009 7 int head[M],cnt,next[M],v[M],b[M],n,k,ans=0x7fffffff; 8 bool pan(int x) 9 { 10 int mx=0; 11 for(int i=1;i<=k;i++) 12 { 13 for(;v[head[i]]>x;head[i]=next[head[i]]); 14 if(!v[head[i]]) 15 return 0; 16 mx=max(mx,x-v[head[i]]); 17 } 18 ans=min(ans,mx); 19 return 1; 20 } 21 int main() 22 { 23 scanf("%d%d",&n,&k); 24 for(int i=1;i<=k;i++) 25 { 26 int a1; 27 scanf("%d",&a1); 28 for(int j=1;j<=a1;j++) 29 { 30 int a2; 31 scanf("%d",&a2); 32 cnt++; 33 next[cnt]=head[i]; 34 head[i]=cnt; 35 v[cnt]=a2; 36 b[cnt]=a2; 37 } 38 } 39 sort(b+1,b+n+1); 40 for(int i=n;i;i--) 41 if(b[i]!=b[i+1]&&!pan(b[i])) 42 break; 43 printf("%d",ans); 44 return 0; 45 }
可以说是暴力吧,枚举剪得末段,找每种颜色离末端最近的是哪一个,更新最优值,易知这是单调的。