ABC366振り返り


[前回の振り返り](https://qiita.com/comet725/items/74a9798b20ef5c082563)

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

https://atcoder.jp/contests/abc366

今回はABCDの4完だがで誤字って1ペナを食らったorz
ケアレスミスには気をつけよう。

# A

片方が過半数以上か判定するだけ、
判定条件の変数をタイポしてWAもらった。

## ソースコード

```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 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():
    N, T, A = rLI()
    
    M = (N-1)// 2 +1
    
    ans = T >= M > 0 or A >= M > 0
    
    print("Yes" if ans else "No")
    
if __name__ == '__main__':
    main()
```

# B

最大の文字数を出して、入力された文字列を順番に出力する
途中で文字列の長さを超えた場合は文字の代わりに`*`を付け足す、
出力時に末尾の`*`を取り除く。

## ソースコード

```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 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():
    N = rI()
    S = [rS() for _ in range(N)][::-1]
    L = [len(s) for s in S]
    M = max(L)
    for j in range(M):
        ans = []
        for i in range(N):
            c = "*"
            if j < L[i]: 
                c = S[i][j]
            ans.append(c)
        k = len(ans) - 1
        while ans[k] == "*": k -= 1
        print("".join(ans[:k+1]))
    
if __name__ == '__main__':
    main()

```

# C

defaultdictで初期値を0に設定、ここでボールの個数を管理
カウンタ変数を用意して、
追加したい変数の個数が0ならカウンタ変数を+1
削除する変数の個数が1ならカウンタ変数を-1
3のクエリが来たらカウンタ変数の値を出力

## ソースコード

```python:main.py
from collections import defaultdict
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,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():
    Q = rI()
    d = defaultdict(lambda: 0)
    c = 0
    for _ in range(Q):
        q = rLI()
        if q[0] == 1:
            if d[q[1]] == 0:
                c += 1
                d[q[1]] = 1
            else:
                d[q[1]] += 1    
        if q[0] == 2:    
            if d[q[1]] == 1:
                c -= 1
                del d[q[1]]
            else:
                d[q[1]] -= 1
        if q[0] == 3:
            print(c)
    
if __name__ == '__main__':
    main()
```

# D

累積和の3次元バージョンだが、
どうすればいいかイメージがつかなかったので、
2次元累積和までやってX軸は順番に足し込んだ。

しかしこの2次元累積和を実装するまでに1時間消費

## ソースコード

```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 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():
    N = rI()
    A = [[rLI() for _ in range(N)] for _ in range(N)]
    S = [[[0] * (N+1) for _ in range(N+1)] for _ in range(N+1)]
        
    for i in range(1, N+1):
        for j in range(1, N+1):
            for k in range(1, N+1):
                S[i][j][k] = A[i-1][j-1][k-1]
                if k > 1:
                    S[i][j][k] += S[i][j][k-1]
    # for i in range(1,N+1):
    #     for j in range(1,N+1):
    #         err(f"{i=}, {j=}, {S[i][j]}")


    for i in range(N+1):
        for k in range(N+1):
            for j in range(1, N+1):
                S[i][j][k] += S[i][j-1][k]

    # err("-"*100)
    # for i in range(1,N+1):
    #     for j in range(1,N+1):
    #         err(f"{i=}, {j=}, {S[i][j]}")
                
    Q = rI()
    for _ in range(Q):
        lx,rx,ly,ry,lz,rz = rLI()
        ans = 0
        # err(f"{lx=},{rx=}")
        # err(f"{ly=},{ry=},{lz=},{rz=}")
        for i in range(lx,rx+1):
            # err(_,i)
            # err(S[i][ry][rz] + S[i][ly-1][lz-1] - S[i][ly-1][rz] - S[i][ry][lz-1])
            # err(S[i][ry][rz], S[i][ly-1][lz-1], S[i][ly-1][rz], S[i][ry][lz-1])
            ans += S[i][ry][rz] + S[i][ly-1][lz-1] - S[i][ly-1][rz] - S[i][ry][lz-1]
        print(ans)
        
if __name__ == '__main__':
    main()

```

# E

2次元座標軸の図がでてきてそっ閉じ。
しゃくとり法を使えばよかったのね…

# F

ソートしてDPかな？までは合ってた。

# G

グラフの問題はまだできません。

# まとめ

今回は2回目の4完だがAで一回WAを出したのと、
2次元累積和の実装に時間を書けてしまったのが辛い所。

累積和の練習とケアレスミスがないようにしていきたい。