AtCoder Beginner Contest 464 C - Plumage Palette 题解

msjingE打完石山大bf后撤离了

solve

  • 改变小鸟的颜色,且按时间,自然想到按时间排序,考虑答案的维护,用bool数组存是否在当前时刻有这个颜色的显然不行,因为如果你改一个颜色,所有有这个颜色的鸟都被踢飞了
  • 所以我们搞一个桶来记
  • 考虑到要动态处理ans,所以在输入堆桶时就搞一下ans
  • 然后开一个指针扫描排序后数组,如果这个数组的\(d<i\),即是过期决策,直接l++弹出
  • 接下来统计i这个时间时的更新的ans,实现依据桶
  • 弹过期决策时,注意:while (bi[l].d<i)msjing因为这个卡5min
  • 弹决策均摊\(O(1)\)

code

#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=1e6+10;
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-'0';
		ch=getchar();
	}
	return x*f;
}
int n,m,l=1;
struct _
{
	int a,b,d;
}bi[maxn];
bool cmp(_ A,_ B) {return A.d<B.d;}
int p[maxn];
int ans;
int main()
{
	n=read(),m=read();
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&bi[i].a,&bi[i].d,&bi[i].b);
		p[bi[i].a]++;
		if (p[bi[i].a] == 1) ans++;
	}
//	printf("%d\n",ans);
	sort(bi+1,bi+1+n,cmp);
//	for (int i=1;i<=n;i++) printf("%d,%d,%d\n",bi[i].a,bi[i].d,bi[i].b);
	for (int i=1;i<=m;i++)
	{
		while (bi[l].d<i)
		{
			l++;
			if (l>n) break;
		}
		while (bi[l].d == i)
		{
			p[bi[l].a]--;
			if (!p[bi[l].a]) ans--;
			p[bi[l].b]++;
			if (p[bi[l].b] == 1) ans++;
			l++;
			if (l>n) break;
		}
		printf("%d\n",ans);
	}
	return 0;
}
posted @ 2026-06-27 21:53  msjing  阅读(8)  评论(0)    收藏  举报