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

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

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

Codeforces Round #390 (Div.2)

はい。
http://codeforces.com/contest/754

A. Lesha and array splitting

ざっくりと大意

・長さnの数列aをいくつかに分割して、いずれの部分の和も0でないようにすることができるか。

Python3

n=int(input())
a=[int(i) for i in input().split()]
if a.count(0)==n:
    print('NO')
elif sum(a)!=0:
    print('YES',1,sep='\n')
    print(1,n)
else:
    print('YES',2,sep='\n')
    for i in range(1,n):
        if sum(a[:i]):
            print(1,i)
            print(i+1,n)
            break

数列a内に0しかなかったらNOになる。数列aの総和が0ではなかったらそのまま出力する。数列aの総和が0の場合は先頭から分割できる箇所を探して和が0でなくなる部分があれば、そこで2箇所に区切るのが解になる。

B. Ilya and tic-tac-toe game

ざっくりと大意

・4 * 4の盤面でまるばつゲームをする。xの番で1つxをつけて勝つことができるかどうか。

Python3

l=[]
for i in range(4):
    l.append(input())
ans=0
a=b=c=d=''
for i in range(4):
    for j in range(4):
        if j<2:
            a=l[i][j]+l[i][j+1]+l[i][j+2]
        if i<2:
            b=l[i][j]+l[i+1][j]+l[i+2][j]
        if i<2 and j<2:
            c=l[i][j]+l[i+1][j+1]+l[i+2][j+2]
        if i<2 and j>1:
            d=l[i][j]+l[i+1][j-1]+l[i+2][j-2]
        for k in (a,b,c,d):
            if k.count('.')==1 and k.count('x')==2:
                ans=1
print('YES' if ans else 'NO')

端から端まで枠外にならない3連並びで縦横と斜めは2パターンで、'x'が2つと'.‘が1つの箇所があれば勝てる並びがあることになる。コンテストの時、初見時はoooがあって既に負けているパターンを対策したけどそういうのはないことが保証されていたらしい。