题意:
有一个有n个彩珠、m种彩珠的彩带,使每一种彩珠都包含的最小长度是多少?

思路:
离散+尺取法

代码:

#include <bits/stdc++.h>
typedef long long ll;

using namespace std;

const ll inf=998244353;

inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

map<int,int> ma;
struct w
{
    int k, w;
} a[1000005];
int ji=0, mb[1000005];

bool cmp(struct w x,struct w y)
{
    return x.w<y.w;
}

int main()
{
    int n=read(), k=read();
    for(int i=1; i<=k; i++)
    {
        int ki;
        ki=read();
        for(int j=1; j<=ki; j++)
        {
            a[ji].w=read();
            a[ji++].k=i;
        }
    }
    sort(a,a+ji,cmp);
    int l=0, shu=0, ans=inf;
    for(int i=0; i<ji; i++)
    {
        if(!mb[a[i].k])
        {
            shu++;
        }
        mb[a[i].k]++;
        while(shu==k)
        {
            ans=min(a[i].w-a[l].w,ans);
            if(mb[a[l].k]==1)
            {
                shu--;
            }
            mb[a[l].k]--;
            l++;
        }
    }
    cout << ans << endl;
    return 0;
}