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

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

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

Codeforces Round #394 (Div.2)

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

A. Dasha and Stairs

ざっくりと大意

・トラの前に1段目から無限に続く階段がある。また、トラはストライプがお気に入りである。
・トラはストライプが好きなので階段をある区間で偶数の段と奇数の段を数えた。
・a,bのような区間、段があり得ればYES。そうでなければNOを出力する。

Python3

a,b=map(int,input().split())
print('NO' if a==b==0 else 'YES' if b-2<a<=b or b<=a<b+2 or a-2<b<=a or a<=b<a+2 else 'NO')

トラはストライプが好きと記述しておいて、Ouputには偶数奇数のどちらの段も1段以上あることみたいな制限がないので0 1や1 0はYESになる超クソ問題。a,bが同数か1段差ならYESで、2段差以上や0 0はNOになる。a,bを調べるのを色々沢山書いてますがコンテスト中に書いてたa==b, a+1==b, a==b+1のがシンプルですね。はい。

B. Dasha and friends

ざっくりと大意

・長さLの円周上に障害物がn個あって、KefaとSashaは別の地点からスタートして1周する。
・KefaとSashaのそれぞれのスタートからの障害物のあった位置の情報が与えられる。そのような配置があり得るならYES、そうでなければNOを出力する。

Python3

n,l=map(int,input().split())
a=[int(i) for i in input().split()]
b=[int(i) for i in input().split()]
x,y=[],[]

for i in range(n):
    if i==0:
        x.append(a[i]+(l-a[-1]))
    else:
        x.append(a[i]-a[i-1])
for i in range(n):
    if i==0:
        y.append(b[i]+(l-b[-1]))
    else:
        y.append(b[i]-b[i-1])
y=y+y
for i in range(n):
    f=1
    for j in range(n):
        if x[j]!=y[j+i]:
            f=0
    if f:
        print('YES')
        exit()
print('NO')

それぞれの障害物間の距離を計算した配列を用意する。どちらか一方のは末尾に同じものを付け足してもう1周分繰り返している感じ?にする。障害物間の距離を突き合わせてn個連続して一致すればYESで、一致がなければNOとした。コンテスト中はdequeでn回の操作でpopleftで先頭を取り出してappendで末尾に付け足してした時に同じ内容の配列になるか?で調べていたようだった。これもA問題に続いてコンテスト中の書き方のが賢い気がする。。