読者です 読者をやめる 読者になる 読者になる

君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

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を引いた数をセットするようにして数がずれないようにと時間切れを回避。