AT_abc403_c [ABC403C] 403 Forbidden

· · 题解

csdn 传送门

博客园传送门(不建议!!!

这个东西其实轻轻松松就能想到。

首先我们都能想到的是把这 m 个比赛界面看成 m 个集合。

然后这道题就变成了:一共有 n 个元素 m 个集合,有 q 次查询,每次查询会有一种操作(总共有三种操作,具体见题面 qwq 因为我懒不想复制),对于查询 x 这个元素是否在 y 这个集合的操作输出 YesNo(这个含义不必多说,具体见题目)。每个元素可以出现在多个集合。

但是接下来问题来了,看着它的数据范围,你总不可能所有 2 操作都一个一个集合给这个 x 加进去吧……

这个其实也很好解决,再整个集合存所有 2 操作涉及到的元素不就解决了?

为了省事,我们将这个集合的编号定义为 m+1

于是,我们的思路就十分明确。下面就不必多说了,直接上代码吧 qwq:

//码风+实现方法可能有点儿抽象,不喜勿喷。
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e5+10;
int n,m,q;
vector<int>mp[N];
int x,y;
int main()
{
    cin>>n>>m>>q;
    while(q--)
    {
        int op;
        cin>>op;
        if(op==1)
        {
            cin>>x>>y;
            if((std::find(mp[y].begin(),mp[y].end(),x))==mp[y].end())
            {
                mp[y].push_back(x);
            }
        }
        else if(op==2)
        {
            cin>>x;
            if((std::find(mp[m+1].begin(),mp[m+1].end(),x))==mp[m+1].end())
            {
                mp[m+1].push_back(x);
            }
        }
        else
        {
            cin>>x>>y;
            if((std::find(mp[y].begin(),mp[y].end(),x)==mp[y].end())&&(std::find(mp[m+1].begin(),mp[m+1].end(),x)==mp[m+1].end()))
            {
                cout<<"No"<<endl;
            }
            else
            {
                cout<<"Yes"<<endl;
            }
        }
    }
    return 0;
}