思路:尺取法,结构体排序
#include<bits/stdc++.h>
using namespace std;
struct node{
int num;
int id;
}a[2000005];
int vis[1000005];
bool cmp(node x,node y){
return x.num<y.num;
}
int main(){
int n,m,len=1,t,ans=0x3f3f3f3f;
int cnt=0;//区间内不同天数
cin>>n>>m;
for(int i=1;i<=n;i++){
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d",&t);
a[len].id=i;
a[len++].num=t;
}
}
sort(a+1,a+len,cmp);
int s=1;
for(int i=1;i<len;i++){//尺取
if(!vis[a[i].id])cnt++;
vis[a[i].id]++; //选择该天的衣服件数
while(cnt==m){
ans=min(a[i].num-a[s].num,ans);//选取最小差值
vis[a[i].id]--;//则第a[s].id天的衣服可去掉
if(!vis[a[i].id])cnt--;//若去掉第s小件衣服后,改天a[s].id不再被选取则选取不同天数减一
s++; //每次cnt==m,必定使原点前进
}
}
cout<<ans<<endl;
return 0;
}