AtCoder Beginner Contest 464 C-Plumage Palette 题解

我们维护一个桶 \(T\)
\(cnt\)\(T\) 中不为1的元素的个数

\[cnt=\sum{[T_i \neq 0]} \]

那么 \(cnt\) 即为答案
我们将每一只鸟按 \(D_i\) 升序排序
然后进行双指针扫描
具体怎么扫呢?
\(i\) 表示当前的天数,\(j\) 表示 \(j\) 之前的鸟的 \(D_i\)\(j\) 小的最大的 \(j\)
那么当 \(S_j = i\) 时,将 \(j\) 向后移
每次移动时,若 \(T_{A[j]} = 1\) ,则使 \(cnt-1\);
\(T_{B[j]} = 0\) ,则使 \(cnt+1\)
然后这道题就写完了......

#include<bits/stdc++.h>
using namespace std;
const int NUM=3e5+10;

int n,m;
int T[NUM],cnt;
struct node{
	int A,D,B;
}S[NUM];

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>S[i].A>>S[i].D>>S[i].B;
		if(T[S[i].A]==0) cnt++;
		T[S[i].A]++;
	}
	sort(S+1,S+1+n,[](node a,node b){
		return a.D<b.D;
	});
	for(int i=1,j=1;i<=m;++i){
		while(S[j].D==i){
			T[S[j].A]--;
			if(T[S[j].A]==0) cnt--;
			if(T[S[j].B]==0) cnt++;
			T[S[j].B]++;
			j++;
		}
		cout<<cnt<<'\n';
	}
	return 0;
}
posted @ 2026-06-27 22:06  LZYXT  阅读(3)  评论(1)    收藏  举报