Codeforces Round #269 (Div. 2)

はい。 oo---(0/0) 1203(+160)
http://codeforces.com/contest/471
コンテスト中に珍しくHack食らった。。食らったおかげで再提出でACに繋がったのでHackしてくれてありがとうだけど。まぁ、そしてようやくレートは1200以上になったので緑に戻れた。灰色長かった。。。

A. MUH and Sticks

ざっくりと大意

・6つの数が与えれるのでその数で "Bear"か"Elephant"を構成できるか、若しくは"Alien"になるかを出力。
・動物(熊or象)は足の長さが4本が等しい長さで構成する。
・残りの2本で胴体と頭を構成する。熊は頭が胴体より小さい。象は頭と胴体の長さが等しい。
・足/胴体/頭の長さ関係には制限がない。

方針のようなもの

・条件通りに分類する。ネタバレはソースの後に。

l=[int(x) for x in raw_input().split()]
a=[0,0,0,0,0,0,0,0,0,0]
for i in l:
    a[i]+=1
if 6 in a:
    print 'Elephant'
elif 5 in a:
    print 'Bear'
elif 4 in a and 2 in a:
    print 'Elephant'
elif 4 in a and 1 in a:
    print 'Bear'
else:
    print 'Alien'

同じ長さが6本だったら象になる。足が同じ長さで4本あって、頭と胴体が同じ長さのため。
同じ長さが5本だったら熊になる。足が同じ長さで4本あって、違う長さの2本が残るので頭と胴体を構成する。頭と足、胴体と足の長さは関係に制限がないので同じ長さになることがあり得るため。
同じ長さが4本だったら象か熊になる。残り2本が同じ長さなら象。異なる長さなら熊。
同じ長さのものが4本未満ならエイリアンになる。
問題文の分類指示通りに書けばだったけど同じ長さ5本はpretestに含まれていなくて、見逃しやすい条件だったのでHack祭りだった。

同室ならHack成功できるチャンスだった群
http://codeforces.com/contest/471/submission/7963961
http://codeforces.com/contest/471/submission/7958546
上位の人でも間違えていた人が結構いらっしゃるので問題文との戦いである。。

B. MUH and Important Things

ざっくりと大意

・数の大きさによって難易度付けされたタスクの数列が与えられる。
・易しい順で消化しつつ3通り以上の消化手順があるか。
・1 3 3 1で1番目のと4番目の1をどちらを先に消化するかで異なる手順ということになる。

方針のようなもの

・数列が与えられて同じ数が3つ以上あるか、同じ数が2つあるものが2つあれば3通り以上の消化手順が作れるかな??

n=input()
l=[(int(x),i+1) for (i,x) in enumerate(raw_input().split())]
cnt=[0]*2001
l.sort()


def normal(n,l):
    for i in range(n):
        if i<n-1:
            print l[i][1],
        else:
            print l[i][1]


def twotwo(n,l,ch):
    c=0
    for i in range(n):
        if l[i][0]!=ch or c==2:
            print l[i][1],
        elif c==0:
            print l[i+1][1],
            c+=1
        elif c==1:
            print l[i-1][1],
            c+=1
    print


for i in l:
    cnt[i[0]]+=1
    if cnt.count(2)==2:
        sm=cnt.index(2)
        bg=cnt[sm+1:].index(2)
        bg+=(sm+1)
        print 'YES'
        normal(n,l)
        twotwo(n,l,sm)
        twotwo(n,l,bg)
        exit()
    elif cnt.count(3)==1:
        sm=cnt.index(3)
        print 'YES'
        normal(n,l)
        c=aj=0
        for i in range(n):
            if l[i][0]!=sm or c==3:
                print l[i][1],
            else:
                if c==2: aj=-3
                print l[i+c+aj][1],
                c+=1
        print
        c=0
        aj=1
        for i in range(n):
            if l[i][0]!=sm or c==3:
                print l[i][1],
            else:
                if c==2: aj=-2
                print l[i+aj][1],
                c+=1
        print
        exit()

print 'NO'

これでも書きなおして縮めたけどまだ長い。。。タスクは易しい順で情報が欲しいけど、元々の順序の情報も必要になるのにenumerateが便利だった。

同室ならHack成功できるチャンスだった群
http://codeforces.com/contest/471/submission/7964225
テストをみると難易度が全部同じ時に何も出力してないっぽいけどよく分からじ。。
http://codeforces.com/contest/471/submission/7962747
2つが2つあった時と3つが1つあった時では書き方変えないとなのに2つが2つの書き方しか用意してないっぽい。。