C. Web of Lies
题目传送门:
题目截图:
题目大意:
给你一张图,连边代表两个点是朋友。一个点如果它所有的朋友都比它大,那他就出局了。接下来做q个操作:
1 u v
代表uv之间连边;
2 u v
代表uv之间删边;
3
表示输出此时尚未出局的点数。
思路:
面向样例编程。
得到两个关键信息:
- 出局的点也可以继续连边边;
- 哈哈题目有给提示!
意思就是只要有连边就会有人出局,只要不是孤立点就会有机会被淘汰,除非是最强者,否则都会逐个淘汰。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 4e5 + 10;;
int vis[maxn];
int main() {
int n, m;
cin >> n >> m;
int cnt = 0;
int x, y;
while (m--) {
cin >> x >> y;
if (x > y) {
if (vis[y]) cnt++;
vis[y]++;
}
if (y > x) {
if (!vis[x]) cnt++;
vis[x]++;
}
}
int q;
cin >> q;
while (q--) {
int k;
cin >> k;
if (k == 1) {
int x, y;
cin >> x >> y;
if (x > y) {
if (!vis[y]) cnt++;
vis[y]++;
}
if (y > x) {
if (!vis[x])cnt++;
vis[x]++;
}
} else if (k == 2) {
cin >> x >> y;
if (x > y) {
vis[y]--;
if (!vis[y]) cnt--;
} else {
vis[x]--;
if (!vis[x]) cnt--;
}
} else cout << n - cnt << endl;
}
}