Codeforces Round#4 beta (div2 only)
参加してきた。
今回も4問セット。
A
ある数n(≦100)が2つの偶数の和で表せるならYES、そうでないならNOを出力せよ。
偶数+偶数=偶数だから偶数なら表せるのかな?あ、でもn=2の時だけは例外。
一応n=100だし全探索のほうが間違いがないから全探索で書こう。
→Presentation Error→え?あ、デバッグコード(複数ケース入力用)消してないorz→AC
B
queueが大分混んでてロスったなあ……などと思いつつ問題文を読む。
d日後の試験までにsumTime時間勉強したい。
i日目に勉強できる量はminTime[i]以上maxTime[i]以下である。
このときsumTime時間勉強できるならYESと、その次の行に毎日の勉強時間をスペースで区切って、そうでないならNOを出力せよ。
グリーディでOKだよね。→AC
C
ユーザID登録システムを作りたい。n個の名前の入力が与えられる。
それまでに同じ名前が登録されていなかったらOKを、登録されていたらその名前の後に数字(1から始めて初めて重複がなくなる番号)をつけたものを出力せよ。
えーと?名前の最後の文字が数字だったらちょっと面倒か?
set
今の名前が見つかったら、番号を足していってsetに含まれていないとこまで行ったら名前+その数字を出力でおkだな。
送信。queueが全然処理されてない。仕方ないのでDを読む。
D
問題文の意味が全然理解できない。
15分くらい読み返してようやくああ、マトリョーシカみたいなものを作るんだと把握。
こんな問題Aizu Online Judgeで解いたことあったなあ。DPでおk。
書く→送る→例によって全然処理されてない
あれ、CがWrong Answer出てる?
あ、使った名前setに登録してない……修正してResubmit.
残り1時間弱あったがqueueが全然処理されないので諦めてゲームをはじめる。
結果
CがTime Limit Exceeded,DはWrong Answerだったorz
レートは更に下降。
queueが混んでたことで、問題を正確に読む能力の欠如が凄くわかりやすい形で出てくれた。ほんと勉強になります。
もっともっと頑張ろう……
後日
翌日解き直してみたところCは問題文に「名前は小文字のアルファベットのみ」という条件がorz
あ……はい……普通にmapで数えろってことね……
Dは封筒の入れ子はおろか、「カードすら封筒に全く入れられない」という場合がテストケースにあった模様。
そこでWAになっている。問題文にカイテナイヨ……←書いてあんだろうが!死ねよ!
int dp[6000],parent[6000]; void run() { int n,w,h; cin>>n>>w>>h; vector<vi> env; int m=0; rep(i,n) { vi v(3); cin>>v[0]>>v[1];v[2]=i+1; if(v[0]<=w||v[1]<=h)continue; m++; env.pb(v); } if(env.empty()) { cout<<0<<endl; return; } sort(all(env)); rep(i,m)dp[i]=0,parent[i]=-1; rep(i,m) { int mx=0,mxi=-1; rep(j,i)if(env[i][0]>env[j][0]&&env[i][1]>env[j][1]) if(mx<dp[j]) { mx=dp[j]; mxi=j; } dp[i]=mx+1,parent[i]=mxi; } vi ans; int ansi=max_element(dp,dp+m)-dp; for(int p=ansi;p!=-1;p=parent[p]) ans.pb(env[p][2]); reverse(all(ans)); cout<<ans.size()<<endl; rep(i,ans.size()) { cout<<ans[i]; if(i==ans.size()-1)cout<<endl; else cout<<" "; } }
(Dのソース。ヘッダ等省略)