社区讨论
欧拉回路时的常数似乎太大?
P9731[CEOI 2023] Balance参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mjzgfkx5
- 此快照首次捕获于
- 2026/01/04 16:13 2 个月前
- 此快照最后确认于
- 2026/01/07 22:30 上个月
CPP
#include <bits/stdc++.h>
#define PII pair<int, int>
#define fi first
#define se second
using namespace std;
const int N = 100100, M = 1000100;
int n, s, t;
vector<int> C[N];
bool vis[M];
int h[N], d[N], e[M], ne[M], id[M], idx;
void add(int a, int b, int c) {
vis[idx] = vis[idx + 1] = 0;
id[idx] = c, e[idx] = b, ne[idx] = h[a], h[a] = idx++, d[a]++;
id[idx] = c, e[idx] = a, ne[idx] = h[b], h[b] = idx++, d[b]++;
}
vector<PII> C_;
unordered_set<int> P;
void dfs(int x) {
d[x] = 0;
for(int i = h[x]; ~i; i = ne[i]) {
if(vis[i] || vis[i ^ 1]) continue;
vis[i] = 1;
if(id[i] != -1) C_[id[i]] = {x, e[i]};
dfs(e[i]);
}
}
void work() {
P.clear();
for(int i = 0; i < (int)C_.size(); i++) {
PII x = C_[i];
add(x.fi, x.se, i), P.insert(x.fi), P.insert(x.se);
}
for(int x : P) if(d[x] & 1) add(0, x, -1);
for(int x : P) if(d[x]) dfs(x);
for(int x : P) h[x] = -1;
h[0] = -1, idx = 0;
}
void divc(int l, int r) {
if(l == r) return;
int mid = l + r >> 1;
for(int i = 1; i <= n; i++) for(int j = l; j <= mid; j++)
C_.push_back({C[i][j], C[i][j + mid - l + 1]});
work();
for(int i = n; i; i--) for(int j = mid; j >= l; j--) {
C[i][j] = C_.back().fi, C[i][j + mid - l + 1] = C_.back().se;
C_.pop_back();
}
divc(l, mid), divc(mid + 1, r);
}
int main() {
memset(h, -1, sizeof h);
scanf("%d%d%d", &n, &s, &t);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= s; j++) {
int a; scanf("%d", &a);
C[i].push_back(a);
}
divc(0, s - 1);
for(int i = 1; i <= n; i++) {
for(int x : C[i]) printf("%d ", x);
puts("");
}
return 0;
}
T 的乱七八糟,S = 2 也 T 了两个点
回复
共 4 条回复,欢迎继续交流。
正在加载回复...