题目
题意:给出n行数据,从其中选择m行,每行选一个数,问最大值与最小值之差是多少。
先将所有数排序,记录每个数在第几行,然后尺取,因为区间长度m固定,只需要更新答案
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const int N=2000005;
const ll inf=0x3f3f3f3f;
int n,m,b[N];
struct node{
ll x;
int id;
}a[N];
int cmp(node p,node q){
return p.x<q.x;
}
int main(){
scanf("%d%d",&n,&m);
int cnt=0;
int c;
ll u;
for(int i=1;i<=n;i++){
scanf("%d",&c);
while(c--){
scanf("%lld",&u);
a[++cnt].x=u;
a[cnt].id=i;
}
}
sort(a+1,a+1+cnt,cmp);
ll ans=inf,sum=0;
b[a[1].id]++;
sum++;
for(int i=1,j=1;i<=cnt;i++){
if(i>1){
b[a[i].id]--;
if(b[a[i].id]==0)sum--;
}
while(sum<m&&j<cnt){
j++;
if(b[a[j].id]==0)sum++;
b[a[j].id]++;
}
if(sum==m){
ans=min(ans,a[j].x-a[i].x);
}
}
printf("%lld\n",ans);
return 0;
}