april2013
DESCRIPTION
NPCAprilFool'sContest解説TRANSCRIPT
Over View Sheet
● 入出力例から問題を察する● 察せなくても...
– オンライン整数列辞典に投げると答えが降ってくる● 1,11,12,1121,1321,122131,132231...
● 前の数字に1が何個,2が何個,3が何個...– 0個なら書かない
● 適当に文字列処理すれば解ける?
Over View Sheet
● JudgeにはN = 10^9のケースがあります– 計算量が間に合わない
● 実は13項目から全部12233241でループに入る
● ループに入ったら抜け出せば良い● 想定計算量:O(定数)
P! = NP
● 入出力例を見るとPが与えられるので(P-1)!を求めさせる問題と察せる– さっきの式変形ができれば自明
● ただしPが10^9まである– TLE必至– ただし手元では数十秒で実行できる
● 埋め込めば良い– 10^7の倍数の解を埋め込めば良いです
Today is Aprilfoolの入力紹介
● #1 pya
● #2 123
● #3 hi my name is catup
● #4 3.1415926535
● #5 Green Triangle Monster
● #6 no more output
Lying is fun 概要
● 「この中にa人{未満|以上}の正直者がいる」● 「a番の人は{正直者|嘘つき}である」● という発言をするN人が集まる● 正直者の人数の最小値を求めよ● ありえない場合は-1を出力せよ
Lying is fun考察
● 「この中にa人{未満|以上}の正直者がいる」● このタイプの発言だけの場合はどう解くか● 0 i N≦ ≦ に対して「正直者がi人の場合何人の
発言が真実となるか」 をしらべる● 表に書くとわかりやすい
Lying is fun考察
● A「3未満」B「2以上」C「1以上」D「0以上」
● それぞれが真実となる範囲に1を足す● →imos法(累積和)
A B C D 合 i 適性
0 1 1 1 3 3 OK
1 1 1 1 4 2 NG
1 0 1 1 3 1 NG
1 0 0 1 2 0 NG
Lying is fun考察
● 「a番の人は{正直者|嘘つき}である」● これだけの場合は?● グラフを書けば良い
– 一人から一つの辺を他人に伸ばす– 閉路1つを根とする木(クトゥルフ)ができあが
る– 厳密にはクトゥルフの森ができあがる
Lying is fun考察● 各連結成分はある頂点を正直者か嘘つきか決
めると残りも決まる– 2通りの結果がある– 他の連結成分には影響しないので小さい方を取れ
ば良い● クトゥルフ検出は頂点を色つけしたり、強連
結成分分解するなどすればよい
Lying is fun考察● 両方の発言がある場合は?● 一部のクトゥルフの頂点が閉路じゃなくて
「この中にa人{未満|以上}の正直者がいる」のタイプの頂点になる → 木になります!
● そういう木についてはimos法で足す値が1じゃなくなるだけで, 同様に解くことができる
● 問題は普通のクトゥルフの方
Lying is fun考察● 貪欲に正直者が少ない方を取れば良いのか?
– 入出力例6がコーナーケースです● クトゥルフだけで作ることができる正直者の
人数を列挙する必要がある– DPでフラグを立てるなどして その人数が可能か
O(1)で調べることができるようにする● やればできる
Lying is fun想定解
● 連結成分を分解 O(N)
● 木の連結成分をimos 処理 O(N)
● クトゥルフの連結成分をDP O(N^2)
● 各0 i N≦ ≦ について可能か調べるO(N)
● 想定計算量O(N^2)
● N = 10,000ですが定数が軽いので通ります