跳到主要内容

题解:P9343 一曲新词酒一杯

· 阅读需 2 分钟
lailai
Blogger

原题链接

解题思路

维护一个集合,集合元素代表至少有一张红纸的酒杯编号:

  • 操作一:将 xx 插入集合。
  • 第一次操作二:将 1n1\sim n 除了 xx 的所有元素插入集合。
  • 后续的操作二:因为已经进行过一次操作二,集合内至少有 n1n-1 个元素。此时再进行操作二,只要两次操作的 xx 不相同,每杯酒上就至少有一张红纸。
  • 判断:由于集合会自动去重,当集合内有 nn 个元素时,一定为 1n1\sim n,即每杯酒上都至少有一张红纸。

参考代码

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