今日はABC開催日だったので参加結果を振り返る
今回はABCDの4完だがで誤字って1ペナを食らったorz
ケアレスミスには気をつけよう。
A
片方が過半数以上か判定するだけ、
判定条件の変数をタイポしてWAもらった。
ソースコード
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
最大の文字数を出して、入力された文字列を順番に出力する
途中で文字列の長さを超えた場合は文字の代わりに*
を付け足す、
出力時に末尾の*
を取り除く。
ソースコード
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のクエリが来たらカウンタ変数の値を出力
ソースコード
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時間消費
ソースコード
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次元累積和の実装に時間を書けてしまったのが辛い所。
累積和の練習とケアレスミスがないようにしていきたい。