茶色コーダーによるABC383振り返り


# 初めに

あー雪降ってる。
いよいよ冬だな
明日は-4度寒い(おい　二次予選当日だからって、現実逃避するな)

あーあwebの情報をもうちょっと、ちゃんと見てたら4完したんだけどなー
結果としては、aは瞬殺
bは実装に戸惑いつつも12分ぐらいでAC
cはJOIの過去問に部分問題として同じようなのが出てきたので、それを使ってacしました
dはまあネットの情報を見落としてacできませんでした。(あの[アホミス集の記事](https://qiita.com/hidehic0/items/104e6d91c5915c3c6aef)フラグだったか)

さて本題

使っているライブラリ
前回同様まだahcが開催中のため、更新していません
[github](https://github.com/hidehic0/my-kyopro-code/blob/main/Performance/.template/code/main.py)
あと今回あまり問題文を要約するところがないため、要約はしません。

# [A問題](https://atcoder.jp/contests/abc383/tasks/abc383_a)

普通に現在の時間と、水量を取っておいて
各動作ごとに、たった時間を水量から引けばOK

acコード(ライブラリ抜粋)

```py
# コード
N = ii()
L = li(N, il)

current = 0
w = 0

for t, v in L:
    w = max(0, w - abs(t - current))
    w += v
    current = t

print(w)
```

# [B問題](https://atcoder.jp/contests/abc383/tasks/abc383_b)

全探索して解いた
具体的には、加湿されているマスのbool状態を取っておけばいいためフラグ変数を置く
そしてiとjを全探索して条件を満たすマスを探します。条件を満たしているマスはboolをtrueにします
そうすればあとは立っているフラグの最大値を求めればいいです(言語化能力低すぎだろ)

acコード(ライブラリ抜粋)
クソコードですいません

```py
H, W, D = il()
S = li(H, s)
ans = 0
for ai in range(H):
    for ak in range(W):
        for bi in range(H):
            for bk in range(W):
                if ai == bi and ak == bk:
                    continue

                if S[ai][ak] == "#" or S[bi][bk] == "#":
                    continue

                used = [[False] * W for _ in [0] * H]
                used[ai][ak] = True
                used[bi][bk] = True

                for i in range(H):
                    for k in range(W):
                        if abs(ai - i) + abs(ak - k) <= D and S[i][k] == ".":
                            used[i][k] = True

                for i in range(H):
                    for k in range(W):
                        if abs(bi - i) + abs(bk - k) <= D and S[i][k] == ".":
                            used[i][k] = True

                ans = max(ans, sum([l.count(True) for l in used]))

print(ans)
```

# [C問題](https://atcoder.jp/contests/abc383/tasks/abc383_c)

この問題、JOIの過去問のゾンビ島に出てくる　部分問題と同じだと、確信して実装したらACした
具体的には、キューにマスの状態と加湿器から何マス目かという情報を入れてbfsすればいいです
であとは通ったマスのカウントの数を出力すればOKです

b問題を提出してから7分ぐらいでacしました
acコード(ライブラリ抜粋)

```py
MOVES = [(1, 0), (-1, 0), (0, 1), (0, -1)]
H, W, D = il()
S = li(H, s)

used = [[False] * W for _ in [0] * H]

Q = deque()

for i in range(H):
    for k in range(W):
        if S[i][k] == "H":
            used[i][k] = True
            Q.append((i, k, 0))

while Q:
    x, y, t = Q.popleft()

    if t >= D:
        continue

    for mx, my in MOVES:
        nx, ny = mx + x, my + y

        if not (0 <= nx < H and 0 <= ny < W):
            continue

        if S[nx][ny] != ".":
            continue

        if used[nx][ny]:
            continue

        Q.append((nx, ny, t + 1))
        used[nx][ny] = True

print(sum([l.count(True) for l in used]))
```

# [D問題](https://atcoder.jp/contests/abc383/tasks/abc383_d)

色々調べたながれ、約数を9個持つ数とググる。
調べてみると知恵袋に大量にある、えーと２つの素数($p<q$を満たしている)をどちらも2乗して、それをかけた数が$N$以下だったら条件を満たすのかー
エラトステネスの篩で$\sqrt N$以下の素数を列挙して、二分探索使えばいいじゃないかと思い、書いてテストするとACできないなんでだろう。
えーとミスりました$p^8$が$N$以下も条件を満たすのです。
それを書き忘れたからもちろんACできません

後で解説見たら調べたyoutubeで、そんなこと言ってたなと思いました
それで4完の絶好の機会を逃しました

# 終わり

いつもより内容スカスカで、すいません
JOI二次予選頑張ります
レートは30上がって、緑まで、残り110です。

追記：この記事を書き終わった頃には雪はやみました(しょうもな)
以上