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 }

可以说是暴力吧,枚举剪得末段,找每种颜色离末端最近的是哪一个,更新最优值,易知这是单调的。

posted on 2016-03-04 22:55  xiyuedong  阅读(180)  评论(0编辑  收藏  举报