AtCoder Beginner Contest 216 D - Pair of Balls 大模拟
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 216 D - Pair of Balls 大模拟相关的知识,希望对你有一定的参考价值。
dfs那里很妙:队列i和local成对子,一起pop后要继续搜loca,因为i在退出dfs后会继续在while里判断,如果还有又进dfs;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb push_back
#define fi first
#define se second
#define mem(a,x) memset(a,x,sizeof(a));
#define db double
//======================
const int N=2e5+10;
queue<int>q[N];
int vis[N];
unordered_map<int,int>mp;
void dfs(int i) //第i个的头出现过
{
int loca=mp[q[i].front()];
// vis[q[i].front()]=0;
q[loca].pop();
q[i].pop();
while(q[loca].size()&&vis[q[loca].front()])//pop完之后又有对子
{
dfs(loca);
}
if(q[loca].size())
{
vis[q[loca].front()]=1;
mp[q[loca].front()]=loca;
}
}
int main()
{
int n,m;cin>>n>>m;
for(int i=0;i<m;i++)
{
int k;cin>>k;
for(int j=0;j<k;j++)
{
int t;cin>>t;q[i].push(t);
}
}
for(int i=0;i<m;i++)
{
while(q[i].size()&&vis[q[i].front()])//有而且找到了
{
dfs(i);
}
if(q[i].size())
{
vis[q[i].front()]=1;
mp[q[i].front()]=i;
}
}
int flag=1;
for(int i=0;i<m;i++)
{
if(q[i].size())
{
flag=0;break;
}
}
if(flag) cout<<"Yes";
else cout<<"No";
return 0;
}
以上是关于AtCoder Beginner Contest 216 D - Pair of Balls 大模拟的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 115 题解