AtCoder Regular Contest 111 - AtCoder
ARC111, A, B, Dの3問でした。事前の調整をミスって電話が来てしまうミス(?)
CのREはDのコードを間違えてCに提出したもの。
def main():
N, M = map(int, input().split())
M2 = M * M
doubling = [10 % M2]
for i in range(60):
doubling.append(
(doubling[-1] ** 2) % M2
)
ret = 1
for i in range(60):
if N % 2:
ret *= doubling[i]
ret %= M2
N //= 2
print(ret // M)
def main():
N = int(input())
init_unionfind(400000 + 1)
numEdge = [0] * (400000 + 1)
for _i in range(N):
a, b = map(int, input().split())
ra = find_root(a)
rb = find_root(b)
if ra == rb:
numEdge[ra] += 1
else:
unite(a, b)
rc = find_root(a)
numEdge[rc] = numEdge[ra] + numEdge[rb] + 1
from collections import Counter
ccs = Counter(find_root(a) for a in range(1, 400000 + 1))
ret = 0
for cc in ccs:
V = ccs[cc]
E = numEdge[cc]
if E == V - 1:
ret += V - 1
else:
ret += V
print(ret)
なるほど、どうしてだろう
自分のメモを見返したら、特にはっきりした「気づき」を経ることなく、サンプルを絵に描いて理解しようとする流れでグラフになってた
あえて言葉にするなら、この問題はカードの順番を入れ替えても答えに影響しないし、裏表を変えても影響しないので、与えられた配列の形を維持する必要性がないよね、ということで、もっと柔軟な形で持つ感じ
Cがよくわからないので飛ばしてDへ
def main():
_N, M = map(int, input().split())
from collections import defaultdict
edgelist = []
for _i in range(M):
frm, to = map(int, input().split())
edgelist.append((frm - 1, to - 1))
CS = list(map(int, input().split()))
answer = {}
edges = defaultdict(list)
for v1, v2 in edgelist:
if CS[v1] > CS[v2]:
answer[(v1, v2)] = "->"
elif CS[v1] < CS[v2]:
answer[(v1, v2)] = "<-"
else:
edges[v1].append(v2)
edges[v2].append(v1)
for v1, v2 in edgelist:
if (v1, v2) not in answer:
answer[(v1, v2)] = "->"
answer[(v2, v1)] = "<-"
def visit(e):
(v1, v2) = e
for v3 in edges[v2]:
if v3 == v1:
continue
if (v2, v3) in answer:
continue
answer[(v2, v3)] = "->"
answer[(v3, v2)] = "<-"
visit((v2, v3))
visit((v1, v2))
for v1, v2 in edgelist:
print(answer[(v1, v2)])
重い荷物から順に、正しい持ち主にわたすようにすればいいね! 渡される側は、正しい荷物になるから重さを気にする必要はなくて、渡す側は軽い荷物と交換になるから、その後も困らない
E