1. 程式人生 > 其它 >AtCoder Beginner Contest 216 D - Pair of Balls

AtCoder Beginner Contest 216 D - Pair of Balls

題目大意
有n種顏色,m個圓柱體,每一種顏色都有2個小球,小球放在這m個圓柱體裡面,每次只能取走圓柱體最上面的相同顏色的小球,問能不能取走所有的小球
思路
把這m個圓柱體看做m個佇列,分別遍歷這m個佇列,當第二次遇到同一顏色的小球時,把這兩個小球拿走, 看最後還有沒有小球在圓柱體面,如果有,那麼就不能取走
vis[i] = 1:小球之前出現過
mp[i] = a:第i個小球之前出現過的位置在第a個圓柱體最上面
空間複雜度稍稍有一點大,還是可以過

#include<iostream>
#include<cstring>
#include<unordered_map>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
using namespace std;
const int N = 2e5 + 10;
int n, m;
unordered_map<int, int=""> mp;
vector<queue<int>> q(N);
bool vis[N];
void dfs(int i)
{
    //mp.count(q[pos].front())
    int pos = mp[q[i].front()];
    q[pos].pop();
    q[i].pop();
    while(!q[pos].empty() && vis[q[pos].front()])
    {
        dfs(pos);
    }
    if(!q[pos].empty())
    {
        vis[q[pos].front()] = 1;
        mp[q[pos].front()] = pos;
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x;
        cin >> x;
        for (int j = 1; j <= x; j++)
        {
            int t;
            cin >> t;
            q[i].push(t);
        }
    }
    for(int i = 1; i <= m; i++)
    {
        while(!q[i].empty() && vis[q[i].front()])
        {
            dfs(i);
        }
        if(!q[i].empty()) //記錄棧頂元素時記得不要越界了
        {
            vis[q[i].front()] = 1;
            mp[q[i].front()] = i;
        }
    }
    /*
2 2
2
1 2
2
1 2
    */
    int flag = 0;
    for (int i = 1; i <= m; i++)
    {
        if (!q[i].empty())
        {
            flag = 1;
            break;
        }
    }
    if (flag)
        puts("No");
    else
        puts("Yes");
}
```</queue<int></int,></queue></vector></string></algorithm></unordered_map></cstring></iostream>