题目大意

有n天,每天穿一件衣服,第天有件衣服可以穿,穿第件衣服的的权值为
求其中任意m天中,所穿衣服的权值最大值与最小值的最小差。

解题思路

我们要做的是最小化最大最小值之差,所以必要的肯定是把所有衣服按照权值从小到大排个序。
我们可以把每件衣服打一个标记,记录一下是从哪一天来的。然后在里面维护一个来自不同的天的个数为m,这些衣服的权值必定是大于左端点小于右端点,直接求ans即可。

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e6+10;
struct node
{
    int x,y;
} a[N];
int b[N],l=1,r,x,tot,ans=1e9;
bool cmp(node x,node y)
{
    return x.y<y.y;
}
int main()
{
    int n,m,x,i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        for(j=1;j<=x;j++)
        {
            scanf("%d",&a[++tot].y);
            a[tot].x=i;
        }
    }
    sort(a+1,a+tot+1,cmp);
    x=0;
    while(x<m)
    {
        r++;
        if(!b[a[r].x]) b[a[r].x]++,x++;
    }
    while(r<=tot)
    {
        ans=min(ans,a[r].y-a[l].y),b[a[l].x]--,x--,l++;
        if(!b[a[l].x]) b[a[l].x]++,x++;
        while(x<m && r<=tot)
        {
            r++;
            if(!b[a[r].x]) b[a[r].x]++,x++;
        }
    }
    printf("%d\n",ans);
}