AtCoder Beginner Contest 216 D - Pair of Balls
阿新 • • 發佈:2021-08-30
題目大意
有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>