ABC333E 题解
题目传送门。
思路
从后往前扫一遍,如果遇到怪兽就使该种类怪兽的 加 ,反之如果遇到药水且后方有该种类的怪兽等待消灭就捡起该药水并将 (答案的第二行)设为 。
如果最后还有某种怪兽等待消灭,输出 。
否则,再次模拟,输出 及 。
证明答案最小
因为每一瓶药水在该策略下都不会被浪费,所以是最小的。
#include<iostream>
using namespace std;
int n,a[200005],b[200005],cnt[200005],ans[200005];
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
for(int i=n;i>=1;i--){
if(a[i]==2){
cnt[b[i]]++;
}
else{
if(cnt[b[i]]){
cnt[b[i]]--;
ans[i]=1;
}
}
}
for(int i=1;i<=n;i++){
if(cnt[i]){
cout<<-1<<endl;
return 0;
}
}
int p=0,anss=0;
for(int i=1;i<=n;i++){
if(a[i]==1&&ans[i]==1)p++;
else if(a[i]==2)p--;
anss=max(anss,p);
}
cout<<anss<<endl;
for(int i=1;i<=n;i++)if(a[i]==1)cout<<ans[i]<<' ';
return 0;
}

浙公网安备 33010602011771号