ABC337参加記

結果

0ペナ4完でした。
温まったので良かったですが、
1時間以上かけてE問題通せなかったので悔しいです。


各問題の感想・解法

A問題

書くだけですね。
TakahashiとかAokiのスペルミスしてないかちょっと心配でした。

以下コード

n = int(input)
taka, aoki = 0, 0
for i in range(n):
    x, y = MII()
    taka += x
    aoki += y
if taka > aoki:
    print("Takahashi")
elif taka < aoki:
    print("Aoki")
else:
    print("Draw")
B問題

横を見比べてアルファベットが逆順に並んでいる部分があるか判定しました。
本番中には気づきませんでしたが、わざわざこんな書き方しなくても、"BA" in s or "CA" in s or "CB" in s とかで良かったです。
解説にもありましたが、ソートされているか判定するのが一番綺麗な気がします。

以下コード

s = input()
tmp = s[0]
for i in s:
    if (
        (i == "A" and tmp == "B")
        or (i == "A" and tmp == "C")
        or (i == "B" and tmp == "C")
    ):
        print("No")
        exit()
    tmp = i

print("Yes")
C問題

ぱっとみ簡単なのに、少してこずりました。
自身をキーに、自身の後ろの人を要素に持つ辞書を用意して、それを辿って答えを作りました。

以下コード

n = int(input))
a = list(map(int,input().split()))
d = {}
for i, j in enumerate(a):
    if j == -1:
        s = i + 1
    else:
        d[j] = i + 1

ans = [s]
num = 1
while num != n:
    ans.append(d[ans[-1]])
    num += 1
print(*ans)
D問題

問題文をそのままやりました。
xは置き換えれないのでsplit("x")で分割してから累積和を取ってKの長さの区間を全探索、って発想がすぐ出たのは良かったです。

以下コード

h, w, k = map(int,input().split()
s = [list(input()) for _ in range(h)]

# 転置
def tenti(l):
    l = list(zip(*l))
    return l

s_r = tenti(s)
ans = inf

for i in s:
    tmp = "".join(i).split("x")
    for j in tmp:
        if len(j) < k:
            continue
        prf = [0]
        tmp = 0
        for l in j:
            if l == "o":
                tmp += 1
            prf.append(tmp)
        for l in range(len(prf) - k):
            tmp = prf[l + k] - prf[l]
            ans = min(ans, k - tmp)
for i in s_r:
    tmp = "".join(i).split("x")
    for j in tmp:
        if len(j) < k:
            continue
        prf = [0]
        tmp = 0
        for l in j:
            if l == "o":
                tmp += 1
            prf.append(tmp)
        for l in range(len(prf) - k):
            tmp = prf[l + k] - prf[l]
            ans = min(ans, k - tmp)

if ans == inf:
    print(-1)
else:
    print(ans)
E問題

logっぽいなーとは思うものの、実装方針が立たず。
愚直に考えて、一個は飲まないジュースが存在しても良さそう、3本のジュースを2人で飲めば、毒入りジュースは一意に定まりそう、みたいな考察をしていましたが、見当はずれでした。
解説ACはしましたが、まだ理解しきれていない気がします。
log2(ジュースの本数)の人数で判定できるのは、直観に反していて面白いなぁと思った問題でした。