aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

木、グラフ

abc 187 E - Through Path

"「ある頂点の子孫でない頂点に xを足す」は、 「根の子孫に xを足す」と「ある頂点の子孫に -xを足す」に分けることができるので、 全てのクエリを「ある頂点の子孫に x を足す」の形に帰着することができます。"かしこい。は?となりながら解説の言うとお…

abc 152 F - Tree and Constraints (python)

一つでもpath上に黒がある個数を、総数ーpath上がすべて白く塗る個数と置き換えて包除原理を使う。 m 個の path の中から i 個を選ぶ方法は itertools.combinations を使い、1つの path が通る辺の集合を辺1つずつに番号を座圧の要領でつけていき、2進数表…

M-SOLUTIONS プロコンオープン D - Maximum Sum of Minimum

c を降順ソートすると、c [ i ] を新しく頂点に書き込むとき、スコアが c [ i ] になる回数は高々 i 回で、それまでに一つの辺でスコアを c [ i ] 以上獲得している回数は高々 i - 1 回あるので、求める最大値は sum( c [ 1 : ] ) になります。 そして、その…

M-SOLUTIONS プロコンオープン D - Maximum Sum of Minimum

c を降順ソートすると、c [ i ] を新しく頂点に書き込むとき、スコアが c [ i ] になる回数は高々 i 回で、それまでに一つの辺でスコアを c [ i ] 以上獲得している回数は高々 i - 1 回あるので、求める最大値は sum( c [ 1 : ] ) になります。 そして、その…

全国統一プログラミング王決定戦予選 D - Restore the Tree (python)

まず、根になる頂点は、Bには含まれておらず、そのような点 a がただ一つ存在することが分かる。 そして、次に Ai = a となっている辺を全て取り除くと、Bに含まれない点 b が新たに1個以上現れる。その点は、a しか親になりえないので b の親は a とわかる…

arc 045 C - エックスオア多橋君 (python)

頂点1を根として、dfs をしていき、それまでの xor 和を defaultdict (D) で管理して、現在のxor和 = X^a を満たす a が今までの xor和に含まれていればいいので、dfs 順に D [ 現在のxor和^X ] を足していけばいい。根からの xor和がちょうど X になるとき…

agc 039 B - Graph Partition (python)

1,...,n のうちの頂点 i から bfs をはじめて最短何回で全頂点辿れるかを計測しつつ、i から1回で通れる頂点, 最短2回で通れる頂点,,, をリストに入れておく。 答えが -1 にならない条件は i から同じ回数で辿りつける任意の2頂点が辺を持たないことであ…

WUPC 2012 E - 会場への道 (python)

拡張ダイクストラの簡単な問題ということで、まず解いてみました。通常のダイクストラと何が違うかというと、例えば、頂点が3つなら最小距離を保存するリスト d も d = [float("inf")] * 3 とかで十分でしたが、今回の問題のように、総距離が4の倍数になる…

abc 035 d (python)

ダイクストラ法の問題 この問題は道路を片方向にしか通れないので、1からkまでの最短路とkから1までの最短路は別に求める必要がある。 import sys input = sys.stdin.readline n,m,t = map(int,input().split()) a = list(map(int,input().split())) a = …

abc 073 d (python)

ワーシャルフロイド法で解く問題 街の通り方は順列で全探索した 計算量は最大(200**3 + 8!) くらいで pypy3 で 330ms def warshall_floyd(d): #d[i][j]: iからjへの最短距離 for k in range(n): for i in range(n): for j in range(n): d[i][j] = min(d[i][j…

abc 075 c 'bridge' (python)

素直に問題文を言いかえせずに解いたら解けるという変わったパターンだった。 制約が最大50*50なことを重視するべきだった。 辺を一つ減らして毎回 Union-find をして一つの木でなかったら (大きさが N でなかったら)ans += 1 するという方針 n, m = m…

abc 079 d 'Wall' (python)

ほかっておいた蟻本の2-5章を進め始めた 蟻本がC+で書かれていても、先人の方々が python のコードをまとめてくださっているので独学でもなんとか耐えている 神サイト 蟻本 初級編 python カテゴリーの記事一覧 - じゅっぴーダイアリー今回はワーシャルフロ…

abc120 d 'Decayed Bridges' (python)

Union-find木 の練習 Union-find のライブラリーはじゅっぴーさんのをそのまま使わせていただいております。 蟻本 python Union-Find木 競技プログラミング - じゅっぴーダイアリーUnion-find はつなげることしかできないので、入力を逆向き (append でなく …

abc126 d (python)

E が Union-find 木でとけるのでこれもそれでいけるのではと考えたが、辺の重みを更新する挙動をよく理解できていないため出来なかった。 結局いつも通り辺のリストを作成して dfs して解いた。 いつもと違う点は、辺のリストに [u-1,w] という形でいれてお…

arc037 b (python)

https://qiita.com/saba/items/affc94740aff117d2ca9コードはこれを参考にしましたこれもとりあえず辺のリストを作成 ループがあることをどう表現するかがポイント 一周したというのを、「一回見た頂点に戻ってきた」と置き換えると memo = [True]*n で一回…

abc138 d 'ki' (python3)

辺がn-1本あるので、すべての頂点が一つの木を構成しているとわかる。辺のリストを管理するには、 for i in range(n-1): u, v = map(int, input().split()) u -= 1 v -= 1 g[u].append(v) g[v].append(u) としてやればよく、辺を全て全探索するには、 def df…