题目描述
题解
两个指针扫一遍就行了。
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 1000005
#define inf 2100000000
int n,k,m,x,cnt,l,r,now,ans;
struct hp{int col,loc;}a[N];
int p[105];
int cmp(hp a,hp b)
{
return a.loc<b.loc;
}
void inc(int i)
{
if (!p[a[i].col]) ++now;
++p[a[i].col];
}
void dec(int i)
{
--p[a[i].col];
if (!p[a[i].col]) --now;
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=k;++i)
{
scanf("%d",&m);
for (int j=1;j<=m;++j)
{
scanf("%d",&x);
a[++cnt].col=i,a[cnt].loc=x;
}
}
sort(a+1,a+cnt+1,cmp);
l=r=1;inc(1);ans=inf;
while (l<=n)
{
while (now<k&&r<n)
{
++r;
inc(r);
}
if (now>=k) ans=min(ans,a[r].loc-a[l].loc);
dec(l);++l;
}
printf("%d\n",ans);
}