kwm_t

kwm_tのメモ

PAST3

■A - ケース・センシティブ

書いてるとおりにやる


■B - ダイナミック・スコアリング一

瞬ん?となるけど素直にシュミレーションするだけ


■C - 等比数列

1 == R は別処理して、とかしなくても通るオーバーフローだけ見ればいい


■D - 電光掲示

char D[10][15] = { {'#','#','#','#','.','#','#','.','#','#','.','#','#','#','#'}, {'.','#','.','#','#','.','.','#','.','.','#','.','#','#','#'},

{'#','#','#','.','.','#','#','#','#','#','.','.','#','#','#'},

{'#','#','#','.','.','#','#','#','#','.','.','#','#','#','#'},

{'#','.','#','#','.','#','#','#','#','.','.','#','.','.','#'},

{'#','#','#','#','.','.','#','#','#','.','.','#','#','#','#'},

{'#','#','#','#','.','.','#','#','#','#','.','#','#','#','#'},

{'#','#','#','.','.','#','.','.','#','.','.','#','.','.','#'},

{'#','#','#','#','.','#','#','#','#','#','.','#','#','#','#'},

{'#','#','#','#','.','#','#','#','#','.','.','#','#','#','#'},};

みたいなのを作るの時間がかかった。


■E - スプリンクラー

QとNが小さいので一番最悪でもO(QN)


■F - 回文行列

やるだけ


■G - グリッド金移動

典型BFSと思いきや、無限に広がると書いている。

だが[-200,200]より上下に一つ広げた[-201,201]だけ見れば十分なので

座標を全て(+201,+201)して

start(201,201) end = (201+X,201+Y)としてBFS


■H - ハードル走

dp[i+1] dp[i+2] dp[i+4]に配るdp

ゴールを飛び越えるときのみ微調整


■I - 行列操作 

毎回全部入れ替えるとTLEするので

転置しているかどうかと、x列の並び、y列の並びをそれぞれ保持しておく

答えがintで収まらないことに注意。


■J - 回転寿司

セグ木+二分探索


■K - コンテナの移動

プログラム入門書のポインタ編とかに載ってそう

文字列クラスの自作とかでnext繋いでとかありますよね


■L - スーパーマーケット

セグ木を二本持つ。

商品がないなら-1とか入れとけばOK


■M - 行商計画問題

巡回セールスマン。

N地点あるが、K地点+スタート地点間の距離だけわかればいいから

それぞれからbfsをする。

あとはdp[1<<(K+1)][K+1]で今まで行った場所と今いる場所。


■N - 入れ替えと並び替え

無理でした。

A[i] > A[i+1]な箇所だけ覚えておいて

lowerboundとか使ってうまいことすれば間に合うらしい

 

■O - 輪投げ 

フロー。

最大と書いているけど最小費用流なやつ

ACLは負のコストに対応していないので微調整をする必要がある。

ABC186:リアルタイム参加

ABC186:リアルタイム参加

■A - Brick (1分)
割り算

■B - Blocks on Grid(2分)
全部見てmin調べて
ΣA[i][j]-min*H*W

■C - Unlucky 7(3分)
愚直

■D - Sum of difference (4分)
ソートして適当に

■E - Throne
なんでこれが解けないのか。。
S + xK = 0 (modN) を満たす最小のxが答え
ここまではわかるしS,K,NのGCDでそれぞれを割る必要があるのもわかる。
long long ans = mod(-S * inv_mod(K, N), N)が答えなのもわかる。
1 != gcd(K, N)が不可能なことがテンパって最後までわからなかった。。。

そもそも手持ちのinv_modが一部バグってるのがオカシイ

■F - Rook on Grid
EでクソハマりしたのでFに残りの大部分を打ち込む。
セグ木で管理すればいいのはわかったけど、端っこの処理をしないとだめなのを気が付かず。。
テストケースがお上手ですね。。。


◆結果
Dまで10分
パフォーマンス1360

◆感想
大事故
Eが解けないのもFのコーナーケースで死んだのもどうしようもない

◆反省
来年がんばります

ABC185:リアルタイム参加

ABC185:リアルタイム参加

■A - ABC Preparation (1分)
abcdのmin
min(min(a,b),min(c,d));

■B - Smartphone Addiction(9分)
書いてるとおりに実装
充電が限界突破しないことだけ注意

■C - Duodecim Ferra(4分)
(L-1)C11;
オーバフローしないように注意しながら計算

■D - Stamp (10分)
連続する白の区間を取り出して、その長さの最小値がk
あとは計算。Anがソートされてないことに注意

■E - Sequence Matching(35分)
なんでこんなに時間がかかるのか。
dpするだけじゃん。。
i文字目、j文字目まで見た状態をdpでもって
dp[i][j] = min(dp[i-1][j] + 1,dp[i][j-1] + 1,dp[i-1][j-1] + (0 or 1))

■F - Range Xor Query(10分)
Eに10分ぐらい首を傾げて順位表をみたらこっちのほうが解かれていたので問題を読む。
セグメント木で終わりなのでは?と思って書いたらAC


◆結果
Fまで70分
パフォーマンス1750

◆感想
2連続のABC6完
問題を見て典型と判断できる知識が増えてきてるのを実感

◆反省
Eに時間をかけ過ぎ
LCSのこととか、なんか知らない知識いるのかなぁとか考えて

違うよなぁとか思っていた時間が無駄。。
最近EDPCやってるのに。。。

◆参考パフォーマンス
Fまで70分
パフォーマンス1750

Fまで60分
パフォーマンス1850

Fまで50分
パフォーマンス2000

PAST2

past2
■A - エレベーター
想定解がよくわからないけど思考停止でmap
■B - 多数決
for文
■C - 山崩し
書いてるとおりにやるだけ
■D - パターンマッチ
全列挙してsetのsize
■E - 順列
問題の日本語下手すぎでは?
■F - タスクの消化
priority_queue
■G - ストリング・クエリ
deque
■H - 1-9 Grid
典型BFSを少し変形。
■I - トーナメント
愚直シュミレーション
■J - 文字列解析
stack
■K - 括弧
dp
■L - 辞書順最小
セグメント木
■M - 食堂
実装が重い!ダブリング
■N - ビルの建設
座標圧縮して二次元imos。。。
だと、TLEしてしまうので、二次元BIT
■O - 可変全域木
LCAを他人のライブラリのコピペしてるだけだったので
無理でした。。

ARC110:リアルタイム参加

ARC110:リアルタイム参加
■A - Redundant Redundancy
LCMを求めて+1

■B - Many 110
まどろっこしい気がするけど
case1:1
case2:0
case3:11
case4:10
case5:01
case6:110****
case7:101****
case8:011****
で場合分け。

■C - Exoswap
もとからi = P[i]なものがあれば-1
2__4__1__5__3とあったとして
2←4←1__5__3
2→4__1__5__3
2__4__1←5←3
2__4→1→5__3
2__4__1__5→3
な感じで各区間にそれぞれの矢印が一つずつあればいいので
そうじゃなかったら-1
あとは貪欲に

◆結果
Cまで
レート+9

◆感想
600が解けない。



■D - Binomial Coefficient is Fun
畳み込みとかするのかなぁ
でも計算量的に無理だしなぁ。。
とか思って解説見たら、あーなるほどと脱帽

■E,F
見てない。

エスパーのススメ(ARC109-E)

汎用的エスパー?なので書き残し

問題の設定上、答えはx/2^Nの形になるのは明らか。

なのでサンプルの答えに2^Nをかけてみる

 

サンプル3に2^19をかけたもの

 

4980736

4980736

4980742

4980782

4981006

4982158

4987790

5014414

5137294

5694350

5137294

5014414

4987790

4982158

4981006

4980782

4980742

4980736

4980736

 

差分を取ってみる。

 

0

6

40

224

1152

5632

26624

122880

557056

-557056

-122880

-26624

-5632

-1152

-224

-40

-6

0

 

差分を眺めてみる。

0

3*2

5*8

7*32

9*128

11*512

略。。。

AC

割と使えそうなテク。

ARC109:リアルタイム参加

ARC109:リアルタイム参加

■A - Hands
O(1)でできそうだけど
面倒なので何も考えずにダイクストラ

■B - log
二部探索
これでも多分O(1)でできる。

■C - Large RPS Tournament
テンパって事故った。
そもそも初見時に問題文読み間違えてるし。
結局無駄に面倒なことして時間を消費
あとじゃんけんの勝ち負けの処理ぐらいはテンプレもっといたほうが楽。

◆結果
Cまで

◆感想
前回のARCよりかはマシだけどこれも大事故
Dが解けないことではなく
Cに時間を溶かしすぎなのが大反省。
来週のARCもがんばります。。。


以下コンテスト外にやったもの

■D - く
向きを変更してからゴールまで持ってけばいいんじゃ?とか思ったけど
実装が面倒+あってる気がしないので諦め。
コンテスト終了後解説をチラ見してみる。
実験エスパー?っぽことが書いていたので
BFSして実験エスパーしてみる。
実験エスパーして、それが帰納法で成り立つっぽいことを確認して実装。
実験コード書くのもまあまあ時間かかったので
やっぱりCで時間かかってる時点でダメダメ。

■E - 1D Reversi Builder
twitterで流れてた解説をチラ見した限り割となんとかなりそうじゃ?
と思ったのでトライ。
とりあえずマスの黒白を入れ替えると結果がほとんど入れ替わるので
基本的にはN/2になることがわかる。
結果が変わるのは
(BBBBBB)(W.........B)(WWWWWWW)
みたいな中間ゾーンの超ど真ん中にsがあるときのみ。
なので長さが(2 * i + 1)なる2 ^ (2 * i - 1)通りだけ
差分がでるので
N/2 + 1/2^N*Σ2 ^ (2 * i - 1)*(2 * i + 1)を計算する

◆感想2
実験エスパーという手法を学んだ。
でも結局実験コードを実装する時間が必要なので
実装スピードを頑張らないと!