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

浙公网安备 33010602011771号