QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#199212#5208. Jumbled TreescomplexorWA 1ms3192kbC++143.9kb2023-10-03 23:04:002023-10-03 23:04:00

Judging History

你现在查看的是最新测评结果

  • [2023-10-03 23:04:00]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3192kb
  • [2023-10-03 23:04:00]
  • 提交

answer

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <cassert>
#include <numeric>
typedef long long LL; 
typedef std::pair<int, int> pii;
#define MP std::make_pair
#define fi first
#define se second
LL read()
{
	LL s = 0; int f = 1;
	char c = getchar();
	while (!(c >= '0' && c <= '9'))
		f ^= c == '-', c = getchar();
	while (c >= '0' && c <= '9')
		s = s * 10 + (c - '0'), c = getchar();
	return f ? s : -s;
}
const int MAXN = 1005;
int n, m, P, cur = 0;
auto fplus = [](int x, int y){ return x + y >= P ? x + y - P : x + y; };
auto fminus = [](int x, int y){ return x >= y ? x - y : x + P - y; };
int fpow(int x, int y)
{
	int res = 1;
	for (; y; y >>= 1, x = (LL)x * x % P)
		if (y & 1) res = (LL)res * x % P;
	return res;
}
int inv(int x){ return fpow(x, P - 2); }
struct DSU
{
	int fa[MAXN];
	void init(int n){ std::iota(fa + 1, fa + n + 1, 1); }
	int getFath(int x){ return x == fa[x] ? x : (fa[x] = getFath(fa[x])); }
	bool merge(int x, int y)
	{
		x = getFath(x), y = getFath(y);
		return fa[x] = y, (x != y);
	}
} dsu;
struct Edge
{
	int u, v, w;
	Edge(int _u = 0, int _v = 0, int _w = 0)
	: u(_u), v(_v), w(_w) {}
} e[MAXN];
int val[MAXN], D = 0, id[MAXN], st[MAXN], dep[MAXN];
std::vector<pii> T[MAXN];
std::vector<int> t[MAXN], node[MAXN];
pii fa[MAXN];
bool vis[MAXN];
void dfs(int x, int fat)
{
	dep[x] = dep[fat] + 1;
	for (pii y : T[x])
		if (y.fi != fat)
			fa[y.fi] = MP(x, y.se), dfs(y.fi, x);
}
int getLca(int x, int y)
{
	if (dep[x] < dep[y]) std::swap(x, y);
	while (dep[x] > dep[y]) x = fa[x].fi;
	while (x != y) x = fa[x].fi, y = fa[y].fi;
	return x;
}
int tot, sum, f[MAXN];
void dfs(int x, int fat, int dep)
{
	// printf("|%d %d|\n", x, dep);
	tot++, sum = fplus(sum, e[x].w), vis[x] = true;
	D = std::max(D, dep), node[dep].push_back(x);
	for (int y : t[x])
		if (y != fat) dfs(y, f[y] = x, dep + 1);
}
int ST[2025][MAXN], cnt, ans = 0, vld[2025];
int main()
{
	n = read(), m = read(), P = read();
	for (int i = 1; i <= m; i++)
		e[i].u = read(), e[i].v = read(), e[i].w = read();
	dsu.init(n);
	cur = 0;
	for (int i = 1; i <= m; i++)
		if (dsu.merge(e[i].u, e[i].v)) 
		{
			T[e[i].u].emplace_back(e[i].v, i);
			T[e[i].v].emplace_back(e[i].u, i);
			vis[i] = true, st[++cur] = i, id[i] = cur;
		}
	assert(cur == n - 1);
	dfs(1, 0);
	dsu.init(m);
	for (int i = 1; i <= m; i++)
		if (!vis[i]) 
		{
			int lca = getLca(e[i].u, e[i].v);
			for (int x = e[i].u; x != lca; x = fa[x].fi)
				if (dsu.merge(fa[x].se, i))
					t[fa[x].se].push_back(i), t[i].push_back(fa[x].se);
			for (int x = e[i].v; x != lca; x = fa[x].fi)
				if (dsu.merge(fa[x].se, i))
					t[fa[x].se].push_back(i), t[i].push_back(fa[x].se);
		}
	memset(vis, false, sizeof vis);
	int S = -1;
	for (int i = 1; i <= m; i++) 
		if (!vis[i])
		{
			tot = sum = 0, dfs(i, 0, 0);
			tot %= P;
			// printf("|%d %d|\n", tot, sum);
			if (tot == 0 && sum != 0)
				return printf("-1\n"), 0;
			else if (tot != 0)
			{
				if (S == -1) S = (LL)sum * inv(tot) % P;
				else if (S != (LL)sum * inv(tot) % P) 
					return printf("-1\n"), 0;
			}
		} 
	if (S != -1)
	{
		vld[++ans] = S, memcpy(ST[ans] + 1, st + 1, (n - 1) << 2);
		for (int i = 1; i < n; i++) val[st[i]] = fplus(val[st[i]], S);
	}
	for (int i = D; i; i--)
		for (int x : node[i])
		{
			int delt = fminus(e[x].w, val[x]);
			vld[++ans] = delt;
			for (int i = 1; i < n; i++)
				ST[ans][i] = st[i] == f[x] ? x : st[i];
			val[x] = fplus(val[x], delt);
			delt = fminus(0, delt);
			vld[++ans] = delt;
			for (int i = 1; i < n; i++)
				ST[ans][i] = st[i] == x ? f[x] : st[i];
			val[f[x]] = fplus(val[f[x]], delt);
		}
	// for (int x : node[0])
	// 	assert(val[x] == e[x].w);
	// ans = 1;
	printf("%d\n", ans);
	for (int i = 1; i <= ans; i++)
	{
		printf("%d ", vld[i]);
		for (int j = 1; j < n; j++)
			printf("%d%c", ST[i][j], " \n"[j == n - 1]);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3192kb

input:

3 3 101
1 2 30
2 3 40
3 1 50

output:

5
40 1 2
0 1 2
0 1 3
50 3 2
51 1 2

result:

wrong answer Wrong value of edge 0 (1-based): expected = 30, actual = 91