看是求最小区间,100W数据,尺取法稳稳地
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<utility>
#define fi first
#define se second
#define pii pair<int,int>
#define MP(x,y) make_pair((x),(y))
using namespace std;
const int inf=0x7f7f7f7f;//
inline int read()
{
int ans,f=1;char ch;
while ((ch=getchar())<'0'||ch>'9') if (ch=='-') f=-1;ans=ch-'0';
while ((ch=getchar())>='0'&&ch<='9') ans=ans*10+ch-'0';
return ans*f;
}
int n,k;
pii a[1000005];
int b[62];
int main()
{
n=read();k=read();
int tot=0;
for (int i=1;i<=k;i++)
{
int x=read();
for (int j=1;j<=x;j++) a[++tot].fi=read(),a[tot].se=i;
}
sort(a+1,a+n+1);
int r=0,num=0,ans=inf;
for (int l=1;l<=n;l++)
{
if (l>1)
{
int t=a[l-1].se;
b[t]--;
if (b[t]==0) num--;
}
while (num<k)
{
r++;
if (r>n) break;
int t=a[r].se;
b[t]++;
if (b[t]==1) num++;
}
if (r>n) break;
ans=min(ans,a[r].fi-a[l].fi);
}
printf("%d",ans);
return 0;
}
1932

被折叠的 条评论
为什么被折叠?



