Codeforces Round #187 (Div. 2)
はい。
http://codeforces.com/contest/315
A. Sereja and Bottles
ざっくりと大意
・n本のソーダのボトルがあるが開ける道具を忘れてしまった ただしなんかボトルで別のボトルを開けられるかもしれない
・i番目のボトルの蓋のタイプはa bの属性を持っていてそのタイプのボトルを開けることが出来る(aとbの数が等しくて、同じi番目ではない場合)
・ただしi番目のボトルがa==bだったとしても他の番目のボトルで開けることが出来るかもしれない
方針のようなもの
・なんとなく適当に開けよう
n=int(raw_input()) ans=0 a,b,chk=[],[],[] for i in xrange(n): x,y=map(int,raw_input().split()) a.append(x) b.append(y) for j in xrange(n): if b[j] in a: if (a.index(b[j])==j and a.count(b[j])==1) or b[j] in chk: pass else: ans+=a.count(b[j]) if b.count(b[j])==1 and a[j]==b[j]: ans-=1 chk.append(b[j]) print n-ans
てきとーに開けてたらWAを3回やらかして大変だった。。。同じi番目でなければ一つのbでaが同じ数なら複数開けられるとからへんの細かい条件が書き方てきとーすぎたのと問題文をよく読んでなくて苦戦したけど楽しかったと思う。
B. Sereja and Array
ざっくりと大意
・n個の\(a_i\)の数列を与えらるのでm回処理をする
・\(t_i\)が1なら2つの数を与えられるのaの\(v_i\)番の数を\(x_i\)にする
・\(t_i\)が2なら全てのaに対して\(y_i\)を加算する
・\(t_i\)が3なら\(q_i\)番目のaを出力する
方針のようなもの
・全部シミュする
n,m=map(int,raw_input().split()) l=[int(x) for x in raw_input().split()] ans=chk=0 for i in xrange(m): t=map(int,raw_input().split()) if t[0]==1: l[t[1]-1]=t[2]-chk elif t[0]==2: chk+=t[1] else: print l[t[1]-1]+chk
はい、全部シミュするとTLEになったので2の時は加算する数を変数でchkに加算しておいて数列に対しては何もしない。1の時は出力時にはchkの加算を行うのでchkを引いた数をセットするようにして数がずれないようにと時間切れを回避。