洛谷P2564 [SCOI2009] 生日礼物 题解

题目传送门。

一眼就是一道类似单调队列结构的东西的题目。
首先将所有坐标排序,然后按照类似单调队列的方法扫,准备一个 \(cnt\) 数组用来记录目前有多少种彩珠,然后弹出的话就是弹出那些没必要要的东西,也就是 \(cnt_x>1\) 的情况要弹出 \(x\)
代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
struct node
{
    int x;
    int y;
}a[N];
int cmp(node x,node y)
{
    return x.x<y.x;
}
int cnt[N];
int num;
queue<node>q;
signed main()
{
    int n,k;
    scanf("%d %d",&n,&k);
    int num1 = 0;
    for(int i = 1;i<=k;i++)
    {
        int t;
        scanf("%d",&t);
        for(int j = 1;j<=t;j++)
        {
            scanf("%d",&a[++num1].x);
            a[num1].y = i;
        }
    }
    sort(a+1,a+n+1,cmp);
    int ans = 1e9;
    for(int i = 1;i<=n;i++)
    {
        if(!cnt[a[i].y])
        {
            num++;
        }
        cnt[a[i].y]++;
        q.push(a[i]);
        while(q.size()&&cnt[q.front().y]>1)
        {
            cnt[q.front().y]--;
            q.pop();
        }
        if(num == k)
        {
            ans = min(ans,a[i].x-q.front().x);
        }
    }
    printf("%d",ans);
    return 0;
}
posted @ 2025-05-09 14:11  林晋堃  阅读(286)  评论(0)    收藏  举报