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

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

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

Codeforces Round #369 (Div.2)

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

A. Bus to Udayland

ざっくりと大意

・バスの着席状況はOが空席でXは着席されてる。ペアで座れるようなとこがあったら確保して++にする。なければNO。

Python2

n=int(raw_input())
l=[]
ans=chk=0
for i in range(n):
    s=raw_input()
    if s[:2]=='OO' and chk==0:
        chk=1
        s='++'+s[2:]
    elif s[3:]=='OO' and chk==0:
        chk=1
        s=s[:3]+'++'
    l.append(s)
if chk:
    print 'YES'
    for i in l:
        print i
else:
    print 'NO'

OOが並んでるトコを1箇所だけ++にすれば大丈夫。replaceしたらOO|OOを++|++にしてしまって無駄にWAした。

B. Chris and Magic Square

ざっくりと大意

・空白のセル0に正の整数を入れて縦横斜めの和がすべて同じようにできるか?

Python2

def ed(x):
    print x
    exit()
n=int(raw_input())
if n==1:
    ed(n)
l=[]
ans=-1
chk=f=0
for i in range(n):
    tmp=map(int,raw_input().split())
    if i==0 and 0 in tmp:
        f=1
    elif i==1 and f==1:
        t0,t1=sum(l[0]),sum(tmp)
        ans=t1-t0
        if ans<1:
            ed(-1)
        l[0][l[0].index(0)]=ans
        chk=t1
    elif i==0:
        chk=sum(tmp)
    elif (0 in tmp or sum(tmp)!=chk) and f==1:
        ed(-1)
    elif 0 in tmp and f==0:
        ans=chk-sum(tmp)
        if ans<1:
            ed(-1)
        tmp[tmp.index(0)]=ans
        f=1
    l.append(tmp)

for i in range(n):
    y=0
    for j in range(n):
        y+=l[j][i]
    if y!=chk:
        ed(-1)
x1=x2=0
for i in range(n):
    x1+=l[i][i]
    x2+=l[i][-1*i-1]
if x1!=chk or x2!=chk:
    ed(-1)
print ans

もう少し完結に書けそうな気がする。あと、0は一箇所のみであることがInputのi,jの情報で保証されてる気がする。
1行目にに0が含まれてたら2行目との差を仮に解として行内の0を置換、3行目以降は行の和で差があったら即時で-1。
1行目に0が含まれていなかったら2行目以降で0を探す。0を含んだ行があったら差を仮に解として行内の0を置換。0を含まない行で差があったら即時で-1。
縦は地道に2重forで各列の和を1行目の和と比較して差があったら即時-1。斜めはfor1回で同時に比較、差があったら即時-1。
縦横斜めのそれぞれの和が等しくて、仮の解が0より大きければ解を出力。と思ったら仮の解が0以下だったら即時-1でよかったことに気づいて該当箇所を書き直して再提出でAC。