QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#199204 | #5208. Jumbled Trees | complexor | WA | 1ms | 3360kb | C++14 | 3.9kb | 2023-10-03 22:55:36 | 2023-10-03 22:55:36 |
Judging History
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 = (tot - 1) % 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);
}
// 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;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3188kb
input:
3 3 101 1 2 30 2 3 40 3 1 50
output:
5 60 1 2 81 1 2 20 1 3 30 3 2 71 1 2
result:
ok Participant found an answer (5 trees) and jury found an answer (5 trees)
Test #2:
score: 0
Accepted
time: 0ms
memory: 3140kb
input:
2 2 37 1 2 8 1 2 15
output:
3 23 1 15 2 22 1
result:
ok Participant found an answer (3 trees) and jury found an answer (3 trees)
Test #3:
score: 0
Accepted
time: 0ms
memory: 3020kb
input:
5 4 5 1 3 1 2 3 2 2 5 3 4 1 4
output:
-1
result:
ok Both jury and participant did not find an answer
Test #4:
score: 0
Accepted
time: 0ms
memory: 2916kb
input:
10 15 997 4 3 459 9 7 94 9 8 767 10 2 877 5 8 258 3 4 166 8 5 621 8 10 619 9 1 316 10 5 516 3 10 125 1 7 961 3 6 500 4 10 976 3 4 842
output:
-1
result:
ok Both jury and participant did not find an answer
Test #5:
score: -100
Wrong Answer
time: 1ms
memory: 3360kb
input:
20 30 9973 1 10 696 3 8 2905 12 7 6609 20 10 1962 11 9 8430 19 2 412 6 3 6936 19 7 9113 14 15 5635 15 7 1770 13 10 3182 3 16 2625 17 1 7387 11 5 3700 9 15 1048 2 3 7717 12 10 8625 7 13 8141 5 14 2245 6 4 2819 18 19 8709 18 5 6191 17 10 7606 9 20 8626 17 4 8848 4 13 1073 10 8 2277 14 2 7714 11 8 5318...
output:
59 296 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 8329 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 1644 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 21 2886 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 7087 1 2 3 4 5 6 7 8 9 10 18 12 13 14 15 16 17 20 21 9383 1 2 18 4 5 6 7 8 9 10 11 12 ...
result:
wrong answer Wrong value of edge 0 (1-based): expected = 696, actual = 7709