ABC288の振り返り(A, B, C, D)
振り返りです。
def test_all(f): for i, data in enumerate(eval(f'test_data{f.__name__[0]}')): exp = data["out"] ans = f(*data["in"]) result = "AC" if exp == ans else "WA" print(f"{i+1} {result}: expected: {exp}, output: {ans}")A - Many A+B Problems
B - Qualification Contest
略
自由欄
C - Don’t be cycle
やってみよう!
C
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
出ました、閉路判定問題。
削除する辺の本数の最小値
という表現が引っかかりますが、とりあえず「辺を追加しようとして、閉路になる場合は除く」でイケんじゃね?という考えで以下。
結果:#38609158
自由欄
D - Range Add Query
やってみよう!
D
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
解説を見る
コンテスト中はても足も出なかったので、早速原案者の解説を見ます。
不変量を考えるとのこと。
…コードを追ってやってることは理解できました。
が、なぜそれで解が得られるのかというところが、証明や最初の解説を見てもしっくりこず…
同じような問題が出ても自力でACできる気がしない😇
from itertools import accumulate def D(N, K, A, Q, lr): cum = [] for i in range(K): cum.append([0] + list(accumulate(a if j % K == i else 0 for j, a in enumerate(A)))) for l, r in lr: ans = True for i in range(K - 1): ans = (cum[i][r] - cum[i][l - 1]) == (cum[i + 1][r] - cum[i + 1][l - 1]) if not ans: print("No") break else: print("Yes") test_all(D)結果:#39005605
まとめ
Dで心折れた