题解:
尺取法
一个l一个r
满足往前
不满足往后
代码:
#include<bits/stdc++.h> using namespace std; const int N=1000005; int n,k,x,a[N],tot,f[N],b[N],c[N]; int cmp(int x,int y) { return b[x]<b[y]; } int main() { scanf("%d%d",&n,&k); for (int i=1;i<=k;i++) { scanf("%d",&x); while (x--) { a[++tot]=i;f[tot]=tot; scanf("%d",&b[tot]); } } sort(f+1,f+n+1,cmp); int l=1,r=1,num=0,ans=2147483647; while (l<=n) { if (r>n&&num<k)break; if (num<k) { c[a[f[r]]]++; if (c[a[f[r]]]==1)num++; r++; } else { c[a[f[l]]]--; if (c[a[f[l]]]==0)num--; l++; } if (num==k)ans=min(ans,b[f[r-1]]-b[f[l]]); } printf("%d",ans); }