april2013

23
NPC April Fool's Contest 2013 解説

Upload: ken-ogura

Post on 05-Jul-2015

132 views

Category:

Documents


1 download

DESCRIPTION

NPCAprilFool'sContest解説

TRANSCRIPT

NPC April Fool's Contest2013解説

Over View Sheet

● 入出力例から問題を察する● 察せなくても...

– オンライン整数列辞典に投げると答えが降ってくる● 1,11,12,1121,1321,122131,132231...

● 前の数字に1が何個,2が何個,3が何個...– 0個なら書かない

● 適当に文字列処理すれば解ける?

Over View Sheet

● JudgeにはN = 10^9のケースがあります– 計算量が間に合わない

● 実は13項目から全部12233241でループに入る

● ループに入ったら抜け出せば良い● 想定計算量:O(定数)

OverViewSheet結果

 TLE多発

P!=NP

● 問題分がアホの子発言なので、頭のレベルを下げて考える

● 「複雑な式変形」「画期的な等式を導く」● P!=NP

● P! = NP

● (P-1)! = N● これが言いたかった

P! = NP

● 入出力例を見るとPが与えられるので(P-1)!を求めさせる問題と察せる– さっきの式変形ができれば自明

● ただしPが10^9まである– TLE必至– ただし手元では数十秒で実行できる

● 埋め込めば良い– 10^7の倍数の解を埋め込めば良いです

P != NP

● コンテスト中にアラートが出ましたね● 参考の論文PDFへのリンクを貼りました

        *      *

     *     +  うそです         n ∧_∧ n

    + (ヨ(* ∀́`)E)

         Y     Y     *

P!=NP結果

 TLE多発

Today is Aprilfool

● 今日はエイプリルフール● 問題文はWikipediaの内容を適当に言い換えま

した● わけがわからないので, OverViewSheetを読み

ましょう

OverViewSheet

● Input Only

● Input Only

● Input Only● Input Only

Today is Aprilfool

● Input Onlyなので出力しなくていいです● main(){}でも通ります

Today is Aprilfoolの入力紹介

● #1 pya

● #2 123

● #3 hi my name is catup

● #4 3.1415926535

● #5 Green Triangle Monster

● #6 no more output

Today is Aprilfool 結果● 一番解かれてましたー● First AC 0:02

Lying is fun

ガチ問です

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ですが定数が軽いので通ります

Lying is fun

● 「エイプリルフールコンテストなのにガチ問」という嘘でしたー

● AC:5人● AC以外の人は手を付けてない感じ

– 普通のコンテストで出せばよかったかもしれない– 反省