ABC385振り返り


前回の振り返り

https://qiita.com/comet725/items/fb8746ef03651b25cc8d

今日はABC385開催日だったので参加結果を振り返る

https://atcoder.jp/contests/abc385

今週はA,Bの2完(0ペナ)


# A

脳筋if文

## ソースコード

```python:main.py
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    A, B, C = rLI()
    ans = A==B==C or A+B==C or A==B+C or A+C==B
    print('Yes' if ans else 'No')
    
if __name__ == '__main__':
    main()

```

# B

大分gridは慣れてきたがやはり実装に時間かかる…

## ソースコード

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from itertools import product, accumulate, groupby
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

dy = [-1, 0, 1, 0]
dx = [0, 1, 0, -1]
move = {c:(y,x)for c,y,x in zip("URDL",dy,dx)}

def main():
    H, W, X, Y = rLI()
    grid = [list(rS()) for _ in range(H)]
    T = rS()
    visited = [[False]*W for _ in range(H)]
    vcnt = 0
    
    cx = X - 1
    cy = Y - 1
    if grid[cx][cy] == "@" and not visited[cx][cy]:
        visited[cx][cy] = True
        vcnt += 1
    for t in T:
        nx, ny = move[t]
        # err((cx+1,cy+1),t,(nx,ny),grid[cx][cy],grid[cx+nx][cy+ny])
        if grid[cx+nx][cy+ny] == "#":
            continue
        cx += nx
        cy += ny
        # err((cx+1,cy+1),grid[cx][cy])
        if grid[cx][cy] == "@" and not visited[cx][cy]:
            visited[cx][cy] = True
            vcnt += 1
        
    print(cx+1,cy+1,vcnt)
    
if __name__ == '__main__':
    main()

```

# C

高さごとにビルの位置を取って最大の等差数列をどうやって作るのみたいな
複雑に考えすぎてわけわかんなくなりパス。

N<=3000なんだからO(N^2)でもいけるのに…

# D

Bの応用で通った家をSetで管理するみたいな手法を試したが
無事にWA,TLEを貰い玉砕

## ソースコード

<details><summary>WA,TLEコード</summary>

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from itertools import product, accumulate, groupby

from sortedcontainers import SortedSet

import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

dy = [-1, 0, 1, 0]
dx = [0, 1, 0, -1]
move = {c:(x,y)for c,y,x in zip("DRUL",dy,dx)}

dhx = defaultdict(SortedSet)
dhy = defaultdict(SortedSet)

visited = set()

def main():
    N, M, X, Y = rLI()
    for _ in range(N):
        x, y = rLI()
        dhx[x].add(y)
        dhy[y].add(x)
    
    cx, cy = X, Y

    for _ in range(M):
        d, c = rLS()
        c = int(c)
        nx, ny = move[d]
        mx, my = nx * c, ny * c

        if nx == 0:
            hs = dhx[cx]
            l, r = sorted([cy,cy+my])
            li = bisect_left(hs, l)
            ri = bisect_right(hs, r) 
            visited.update((cx, hy) for hy in hs[li:ri+1])
            for _ in range(ri-li):
                dhx[cx].pop(li)
        else:
            hs = dhy[cy]
            l, r = sorted([cx,cx+my])
            li = bisect_left(hs, l)
            ri = bisect_right(hs, r) 
            visited.update((hx, cy) for hx in hs[li:ri+1])
            for _ in range(ri-li):
                dhx[cy].pop(li)
        # err(d,c,l,r,hs[li:ri+1])
        cx+=mx
        cy+=my
    
    print(cx, cy, len(visited))

    
if __name__ == '__main__':
    main()

```

</details>

# E

ユ木とかいうネーミングセンスは面白いが
グラフはまだBFSぐらいしかできませんorz

# F

ここの数学頑張ればもしやがあった…？

# G

数え上げでかつmodintとか言う時点で高度すぎる話

# まとめ

入緑以来の屈辱の2完、
クリスマス前で散々な結果になってしまい本当に辛いです…

とりあえずCはN<=3000とかいうO(N^2)のアルゴリズムでもACできそうな成約なのに
適当に作ってトライしなかったのが大きな判断ミスだと思う