ABC309 (2023/07/08)
https://atcoder.jp/contests/abc309/tasks
〇A問題
Yuto.icon 最初modとか使って上手いことやる方法を探してたけど分からなかったので,隣り合うものをべた書き.
Kaplam.icon最初縦も隣り合うと徹夜明けで問題読み違えてWA...
yuichang.icona<bで全部書く
TTT.icon A + 1 == B and A%3 != 0:であればYesとしました。
tako.iconBが4と7の時だけ省く感じにしました
CarpDay.icon6通りコピペ&修正で全部書く.上2人のようにした方がスマートだね.
まーす.iconKaplam.iconさんと同じ。ICPCでも誰かさんと誰かさんが読み間違えてたな笑
おたふく.icon 隣り合う人をdictで管理する。ICPCの隣り合うと勘違いして、上下も含めてしまい痛恨のWA。
yan.iconicpcのC問題で使った作った関数をそのまま起用して実装。ただ問題は隣り合う者同士だけだが上下左右でやってしまってwa
TK.icon打ち間違いでWA もったいない。Aが3の倍数以外のとき、条件満たすか確認
〇B問題
Yuto.icon めんどくさい.ICPCかな?添え字に注意してやる
yuichang.icon面倒くさい。やる。
Kaplam.icon普通に動かすだけのはずがPythonくんが言うこと全然聞いてくれなくてすごく時間かかった、https://pastebin.com/J76DrSvK テスト用に作ったものなのですがnewls変更したらなぜかlsの同じ所にも反映されるのなんでですか...(ls変更してないのになぜか値が変わる、Cのアドレス的な知らない仕様がある?)
CarpDay.icon7行目のnewls[i] = ls[i]では,アドレスを代入(C言語のポインタ代入)しているので,newlsとlsが同じ場所を参照するようになって,newlsの要素を変更するとlsの要素も変更され(るように見え)ます.ls[i]のリストの中身を代入したいなら,newls[i] = ls[i][:]とします.
Kaplam.iconアドレス渡してるの知りませんでした、ありがとうございます。
TTT.icon 愚直に実装しました。AをコピーしたBの外周だけ編集しようとしてて、B = A.copy()としてちゃんと別のリストにしてるはずなのになぜかAとBが連動してしまっていて苦労しました。連続する整数値を一桁ずつに分けるのも苦戦しました。(追記:B[i] = A[i+1]などと書いていたのがまずかったのだと気づきました。コンテスト中に気づけませんでした。)
Yuto.icon Aが二次元以上の時,A.copy()はシャローコピーを返すので,「ちゃんと別のリスト」になっていません.多次元配列のコピーにはcopy.deepcopy()を使うか,B[y][x] = A[y][x]のように一から作り直してください.1次元配列のコピーなら,CarpDay.iconの仰る通りスライスを使うのが楽です.>> TTT.icon よく分かりました、ありがとうございます!
tako.iconAとBを打ち間違えたまま提出して1WA。ダサい
CarpDay.icon中央作って,第0行,第N-1行,第0列,第N-1列を作る.
まーす.icon上と同じ
おたふく.icon 言われたとおりに実装。
yan.icon再帰を使えば時計回りに値を代入&引き渡しが連続でできると思い実装。だがいくつも変数を用意したせいでよくわからなくなってしまい時間がかかった。
TK.iconめんどくさい。言われた通りにできるようにしたが、もう少しきれいにかけた気がする
〇C問題
Yuto.icon 任意のタイミングで増える可能性があると思い込んでいて,時間を浪費する.薬の量は単調減少であることに気付けば簡単.aでソートして前から見ていくだけ.
yuichang.iconイベントソートっぽく。前から見て飲む必要がある薬を減らしていく。
Kaplam.icon辞書とlistに日数と薬の数を入れて、最初から薬を数えてK個を超えたらheapqから一番早い日付を取り出して、その日付の辞書に入ってる値を薬の数から引く、半分ぐらいしか正解でなかったもののBに時間かかりすぎて直せなかった。 追記:同じ日数が複数あるケースと飛びぬけて大きい数字があるケースのバグを修正してすぐAC、Bさくっと終わらせられれば解けてた...
tako.iconYuto.iconさんと同じ感じ
TTT.icon 何日間飲むかをkeyに、何錠飲むかをvalueに入れた辞書を作り、keyで降順ソートしたあとに前のkeyから順にvalueを足していき、その和がKを越したら最後に足したvalueに1を加えたものを出力。その和がいつまでもKを越さないなら1を出力するようにしたのですが、書き方の問題があるのか半分AC半分RE。7ペナでメンタルヘナヘナ。
CarpDay.icon辞書にしたのが間違いの元凶.まーす.iconさんが記した通り,aが同じ薬があると,後から読み込んだ薬でbが上書きされます.>> TTT.icon なるほど!盲点でした。コメントありがとうございます。
CarpDay.icon Yuto.iconさんと同じく1日目以外から飲み始めることがあると勘違いして「いもす法だ!」と勇んでコーディングして時間ロス.落ち着いて問題読もう.Aでソートして,薬の量の変化をリストで格納.そのリストを作るときに既に答えが分かるはずなのに,無駄に二分探索をして解答求めたのはご愛敬.
まーす.icon実は初めて辞書型を使った。なにこれ便利じゃん。WAは重複分を忘れていた。
おたふく.icon 薬を飲まないといけないものを昇順にソート。それから順番に1日に飲む薬の錠数から減らしていき、K以下になったところで出力する。
TK.icon日数ごとに飲まないといけない薬の合計を辞書で管理、キーでソートして、日数が少ない順に薬の合計を減らして条件満たすか確認。初日で満たす場合がうまくいっていなかったようで、WAが1つ着いた。
〇D問題
Yuto.icon n1グループの内1から最も遠い点をu,n12グループの内nから最も遠い点をvとすると,求める答えはdist(1, u) + dist(u, v) + dist(v, n).最も遠い点はダイクストラで求めた.
yuichang.icon結局は頂点1とn1+n2からbfsして最も遠い点同士を結べば良いことに気がつく。
tako.iconBFSで最も遠い点を探しました。
CarpDay.iconyuichang.iconさんtako.iconさんと同じかな.
おたふく.icon ↑3名と同じ。
〇E問題
yuichang.icon3TLE。ダイクストラ。prioity_queueに何代目まで保証対象、その人のidxを大きい順に持つと3TLE。大事なのはその人のidxだと思って逆で実装するも時間が。この方針であっているのなら悔しい。Yuto.iconさんに勝ちました。嬉しい><
追記 元々の方法であってた。最初に複数の保険がかかっている場合を考えていなかった。
Yuto.icon メモ化再帰で良い感じにやったけど34TLE.yuichang.icon に負けました.くやしいです( ˘ω˘ )
CarpDay.icon D問題で使ったBFSを再利用して実装.おかげで早く解けました.解説とはやり方違ったみたい.
おたふく.icon とりあえず、距離がyを超えるところでbfsを打ち切り、全てに対してbfs。当然TLE。
CarpDay.iconグラフで表すと根付き木になるので,根から1回BFSするだけでOKですよ~
〇F問題
CarpDay.icon仕入れたばかりのMultiSetを使って実装.残り4分で投稿するも,敢え無く7/60WA.初の6問ACならず.解説見ずに検討するもWA取れず,解説を確認.あれか...解説のおかげでWAの原因が分かって修正してMultiSetでもAC.コンテスト中に思いつけるようになりたい.解説の並び替えテニック,応用効きそう.
#AtCoder #ABC #グラフ理論 #BFS/DFS #セグメント木