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

浙公网安备 33010602011771号