| 比赛 |
csp2025模拟练习1 |
评测结果 |
WTWEWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT |
| 题目名称 |
通讯网络 |
最终得分 |
0 |
| 用户昵称 |
淮淮清子 |
运行时间 |
180.218 s |
| 代码语言 |
C++ |
内存使用 |
4.07 MiB |
| 提交时间 |
2025-10-28 11:59:11 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAXN = 1e6 + 5;
struct Op{
int t, x, y, k;
}ans[MAXN];
int E, N, Q, last = 0;
pii norm(int x, int y){
return x > y ? make_pair(y, x) : make_pair(x, y);
}
struct DSU{
vector<int> p;
DSU(int n) : p(n + 1){
iota(p.begin(), p.end(), 0);
}
int find(int u){
return p[u] == u ? u : p[u] = find(p[u]);
}
void unite(int u, int v){
u = find(u), v = find(v);
if(u != v) p[u] = v;
}
};
int main(){
freopen("communication.in", "r", stdin);
freopen("communication.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> E >> N >> Q;
for(int q = 1;q <= Q;q ++){
int op; cin >> op;
if(op == 1 || op == 2){
int x, y; cin >> x >> y;
if(E) x ^= last, y ^= last;
pii e = norm(x, y);
ans[q] = {op, e.first, e.second, 0};
}
else{
int t; cin >> t;
if(E) t ^= last;
ans[q] = {op, 0, 0, t};
int s = q, st = max(0, s - t);
unordered_set<ll> ps;
for(int qp = st;qp <= s;qp ++){
set<pii> es;
for(int i = 1;i < qp;i ++){
if(ans[i].t == 1){
es.insert({ans[i].x, ans[i].y});
}
else if(ans[i].t == 2){
es.erase({ans[i].x, ans[i].y});
}
}
DSU dsu(N);
for(auto it = es.begin();it != es.end();it ++){
dsu.unite(it -> first, it -> second);
}
for(int u = 1;u <= N;u ++){
for(int v = u + 1;v <= N;v ++){
if(dsu.find(u) == dsu.find(v)) ps.insert(1LL * u * (N + 1) + v);
}
}
}
last = ps.size();
cout << last << '\n';
}
}
return 0;
}