社区讨论

破数据生成器

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 条回复,欢迎继续交流。

正在加载回复...