社区讨论
破数据生成器
CF938GShortest Path Queries参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjad39c
- 此快照首次捕获于
- 2025/11/03 23:19 4 个月前
- 此快照最后确认于
- 2025/11/03 23:19 4 个月前
CPP
#include <bits/stdc++.h>
#define ps putchar(' ')
#define pn putchar('\n')
#define rep(it, st, ed) for(int it = (st); it <= (ed); it++)
#define Rep(it, st, ed) for(int it = (st); it < (ed); it++)
#define per(it, st, ed) for(int it = (ed); it >= (st); it--)
using ll = long long;
template<class T>
void qr(T &x) {
x = 0;
bool s = 0;
char c;
while(!isdigit(c = getchar()))
if(c == '-')
s = 1;
do x = (x << 3) + (x << 1) + (c ^ 48);
while (isdigit(c = getchar()));
if(s) x = -x;
}
template<class T>
void qw(T x) {
static char _buf[100];
int bp = 0;
if (!x) return putchar('0'), void();
if(x < 0) putchar('-'), x = -x;
while (x)
{
_buf[++bp] = x % 10;
x /= 10;
}
per(i, 1, bp) putchar(_buf[i] | 48);
}
::std::random_device rd;
::std::mt19937 gen(rd());
int g(int l, int r) {
return gen() % (r - l + 1) + l;
}
struct T {
int l, r;
void operator () (int _l, int _r) {
l = g(_l, _r), r = g(_l, _r);
if(l > r) ::std::swap(l, r);
}
};
int n = 5; // n 个点
int m = 1; // n + m - 1 条边
int q = 3; // q 次操作
int cw = 100;
int f[100][100], vis[100], cnt;
void dfs(int u) {
if(vis[u]) return;
vis[u] = 1;
cnt++;
rep(v, 1, n) if(f[u][v] && !vis[v]) dfs(v);
}
int ck() {
rep(i, 1, n) vis[i] = 0;
cnt = 0;
dfs(1);
return cnt == n;
}
int ec = 0;
void adde() {
int u, v, w;
do {
T uv; uv(1, n);
u = uv.l, v = uv.r;
w = g(0, cw);
} while(f[u][v] || u == v);
f[u][v] = f[v][u] = w + 1;
qw(u), ps, qw(v), ps, qw(w), pn;
ec++;
}
int main() {
qw(n), ps, qw(n - 1 + m), pn;
rep(i, 2, n)
{
int u = i, v = g(1, i - 1), w = g(0, cw);
if(u > v) ::std::swap(u, v);
qw(u), ps, qw(v), ps, qw(w), pn;
f[u][v] = f[v][u] = w + 1;
}
ec = n - 1;
rep(i, 1, m) adde();
qw(q), pn;
qw(3), ps, qw(1), ps, qw(n), pn;
rep(i, 2, q)
{
int cmd;
ag:
cmd = g(1, 3);
if(cmd == 1) {
if(ec == n * (n - 1) / 2) goto ag;
qw(1), ps, adde();
}
if(cmd == 2) {
if(ec == n - 1) goto ag;
int u, v;
while(1)
{
do {
T uv;
uv(1, n);
u = uv.l, v = uv.r;
} while(!f[u][v] || u == v);
int tmp = f[u][v];
f[u][v] = f[v][u] = 0;
if(!ck()) f[u][v] = f[v][u] = tmp;
else break;
}
qw(2), ps, qw(u), ps, qw(v), pn;
ec--;
}
if(cmd == 3) {
T uv;
uv(1, n);
qw(3), ps, qw(uv.l), ps, qw(uv.r), pn;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...