这题感觉很蠢啊。
就把每个点按顺序排序,然后队列搞一下。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct node { int pos,c; }q[1100000];int len; bool cmp(node n1,node n2) { if(n1.pos<n2.pos||(n1.pos==n2.pos&&n1.c<n2.c))return true; return false; } int v[1100000]; int main() { int n,m; scanf("%d%d",&n,&m); int T;len=0; for(int i=1;i<=m;i++) { scanf("%d",&T); for(int j=1;j<=T;j++) len++, scanf("%d",&q[len].pos), q[len].c=i; } sort(q+1,q+n+1,cmp); int head=1,tail=0,ans; memset(v,0,sizeof(v)); int s=0; while(s<m) { tail++; if(v[q[tail].c]==0)s++; v[q[tail].c]++; } while(v[q[head].c]>1) { v[q[head].c]--; head++; } ans=q[tail].pos-q[head].pos; //yu for(tail=tail+1;tail<=n;tail++) { v[q[tail].c]++; while(v[q[head].c]>1) { v[q[head].c]--; head++; } ans=min(q[tail].pos-q[head].pos,ans); } printf("%d ",ans); return 0; }