AtCoder ABC212 個人的メモ
所感
abcd4完
A - Alloy
問題文通りに実装
A, B = map(int, input().split())
if 0 < A and B == 0:
print("Gold")
elif A == 0 and 0 < B:
print("Silver")
elif 0 < A and 0 < B:
print("Alloy")
B - Weak Password
公式解説見て書き直した
A = list(map(int, input()))
if len(set(A)) == 1 or all((A[i] + 1) % 10 == A[i + 1] % 10 for i in range(3)):
print("Weak")
else:
print("Strong")
C - Min Difference
各
それは2分探索すれば求まる。
from bisect import bisect_left
N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
B.sort()
ans = 10 ** 18
for a in A:
i = bisect_left(B, a)
for di in (-1, 0, 1):
ni = i + di
if 0 <= ni < M:
ans = min(ans, abs(a - B[ni]))
print(ans)
D - Querying Multiset
操作2の「袋に入っているすべてのボールについて、
また、操作3も「取り出したボールに書かれている数を記録する」という操作を「取り出したボールにそれまで引いた数を加算した数を記録する」と言い換える。
後は操作3の時に袋内の最小値を求めればおk。
毎度最小値を求めるとTLEしそうなので優先度付きキューを使う。
from heapq import heappop, heappush
Q = int(input())
priority_queue = []
ans = []
dec = 0
for _ in range(Q):
P, *X = map(int, input().split())
if P == 3:
ans.append(heappop(priority_queue) + dec)
continue
X = X[0]
if P == 2:
dec += X
if P == 1:
heappush(priority_queue, X - dec)
print(*ans, sep="\n")
E - Safety Journey
頂点
これだと計算量が
制約を見ると
だからこの制約は頂点数が大きい場合には削除される辺の個数が全体の辺の個数に対して小さいことを示している。
これを生かして頂点
これは
EDPC-Rと似ていてdpはすぐに立式できたけれども、うまく遷移を削減できなかった。
制約も見たけど
N, M, K = map(int, input().split())
no_edge = [[i] for i in range(N)]
for _ in range(M):
x, y = map(lambda n: int(n) - 1, input().split())
no_edge[x].append(y)
no_edge[y].append(x) # 有向グラフならこの行は消す!!
MOD = 998244353
dp = [0] * N
dp[0] = 1
for k in range(K):
n_dp = [sum(dp) % MOD] * N
for t in range(N):
for s in no_edge[t]:
n_dp[t] -= dp[s]
n_dp[t] %= MOD
dp = n_dp
print(dp[0])
参考
Discussion