洛谷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;
}

浙公网安备 33010602011771号