LCB-07: A Certain Game
The Task
Scroll to read full problem statement
The Code
Claude Opus 4.6 with max-effort extended thinking. Exact outputs. Side by side.
Baseline
PASS1596ch / 469simport sys
def main():
data = sys.stdin.buffer.read().split()
idx = 0
N = int(data[idx]); idx += 1
MOD = 998244353
parent = list(range(N + 1))
rnk = [0] * (N + 1)
sz = [1] * (N + 1)
delta = [0] * (N + 1)
def find(x):
path = []
while parent[x] != x:
path.append(x)
x = parent[x]
root = x
cumulative = 0
for node in reversed(path):
cumulative = (cumulative + delta[node]) % MOD
delta[node] = cumulative
parent[node] = root
return root
for _ in range(N - 1):
p = int(data[idx]); idx += 1
q = int(data[idx]); idx += 1
rp = find(p)
rq = find(q)
a = sz[rp]
b = sz[rq]
inv_ab = pow(a + b, MOD - 2, MOD)
delta[rp] = (delta[rp] + a * inv_ab) % MOD
delta[rq] = (delta[rq] + b * inv_ab) % MOD
if rnk[rp] < rnk[rq]:
parent[rp] = rq
delta[rp] = (delta[rp] - delta[rq]) % MOD
sz[rq] += sz[rp]
elif rnk[rp] > rnk[rq]:
parent[rq] = rp
delta[rq] = (delta[rq] - delta[rp]) % MOD
sz[rp] += sz[rq]
else:
parent[rq] = rp
delta[rq] = (delta[rq] - delta[rp]) % MOD
sz[rp] += sz[rq]
rnk[rp] += 1
out = []
for i in range(1, N + 1):
root = find(i)
if i == root:
out.append(str(delta[i] % MOD))
else:
out.append(str((delta[i] + delta[root]) % MOD))
sys.stdout.write(' '.join(out) + '\n')
main()Scroll to read full code
Augmented
PASS1423ch / 548simport sys
def main():
MOD = 998244353
data = sys.stdin.buffer.read().split()
idx = 0
N = int(data[idx]); idx += 1
inv = [0] * (N + 1)
if N >= 1:
inv[1] = 1
for i in range(2, N + 1):
inv[i] = -(MOD // i) * inv[MOD % i] % MOD
parent = list(range(N + 1))
sz = [1] * (N + 1)
delta = [0] * (N + 1)
bonus = [0] * (N + 1)
def find(x):
path = []
while parent[x] != x:
path.append(x)
x = parent[x]
root = x
for node in reversed(path):
delta[node] = (delta[node] + delta[parent[node]]) % MOD
parent[node] = root
return root
for _ in range(N - 1):
p = int(data[idx]); idx += 1
q = int(data[idx]); idx += 1
rp = find(p)
rq = find(q)
a = sz[rp]
b = sz[rq]
inv_ab = inv[a + b]
bonus[rp] = (bonus[rp] + a * inv_ab) % MOD
bonus[rq] = (bonus[rq] + b * inv_ab) % MOD
if sz[rp] < sz[rq]:
parent[rp] = rq
delta[rp] = (bonus[rp] - bonus[rq]) % MOD
sz[rq] += sz[rp]
else:
parent[rq] = rp
delta[rq] = (bonus[rq] - bonus[rp]) % MOD
sz[rp] += sz[rq]
ans = []
for i in range(1, N + 1):
r = find(i)
ans.append((delta[i] + bonus[r]) % MOD)
sys.stdout.write(' '.join(map(str, ans)) + '\n')
main()Scroll to read full code
Blind Evaluation
Independent evaluator. Randomized A/B labels. No knowledge of which solution used the injection.
Augmented 45, Baseline 39
| Dimension | Baseline | Augmented |
|---|---|---|
| Correctness | 10 | 10 |
| Efficiency | 8 | 9 |
| Code Structure | 7 | 9 |
| Readability | 6 | 8 |
| Robustness | 8 | 9 |
Blind Analysis
Both solutions solve the problem using a weighted Disjoint Set Union (DSU) structure. When match i merges two teams of sizes a and b, every player on team A accumulates expected wins of a/(a+b) and every player on team B accumulates b/(a+b). Rather than updating every player individually (O(N) per match), both solutions store accumulated win contributions as weighted offsets in the DSU, propagating them lazily through path compression.
Blind Observation
The baseline's find function is the most revealing signal. The cumulative-sum-from-root approach is functionally equivalent to the standard "add parent's delta" pattern, but it is not the version taught in competitive programming references or textbooks. This suggests derivation from first principles — the author understood what path compression must accomplish and engineered a mechanism, rather than pattern-matching to a known template.
Source: LiveCodeBench Hard benchmark. Full code outputs: baseline · augmented · runner script & methodology