题解:P9343 一曲新词酒一杯
· 阅读需 2 分钟
原题链接
解题思路
维护一个集合,集合元素代表至少有一张红纸的酒杯编号:
- 操作一:将 插入集合。
- 第一次操作二:将 除了 的所有元素插入集合。
- 后续的操作二:因为已经进行过一次操作二,集合内至少有 个元素。此时再进行操作二,只要两次操作的 不相同,每杯酒上就至少有一张红纸。
- 判断:由于集合会自动去重,当集合内有 个元素时,一定为 ,即每杯酒上都至少有一张红纸。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
set<int> s;
while(T--)
{
s.clear();
int n,m;
cin>>n>>m;
int ans=-1,p=0;
for(int i=1;i<=m;i++)
{
int o,x;
cin>>o>>x;
if(ans!=-1)continue;
if(o==1)
{
s.insert(x);
}
else if(o==2)
{
if(!p)
{
for(int j=1;j<=n;j++)
{
if(j!=x)s.insert(j);
}
p=x;
}
else if(x!=p)ans=i;
}
if(s.size()==n)ans=i;
}
cout<<ans<<'\n';
}
return 0;
}