本期四道水题
C - Go to School
位置数组遍历
D - Disjoint Set of Common Divisors
简单的数论题
求gcd中的质因数个数+1
E - Get Everything
简单dp。会位操作就会做。
# -*- coding: utf-8 -*-
# @time : 2023/6/2 13:30
# @author : yhdu@tongwoo.cn
# @desc :
# @file : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(50050)
def main():
items = sys.version.split()
if items[0] == '3.10.6':
fp = open("in.txt")
else:
fp = sys.stdin
n, m = map(int, fp.readline().split())
a = [0] * m
c = [0] * m
for i in range(m):
t, k = map(int, fp.readline().split())
a[i] = t
b = list(map(int, fp.readline().split()))
for j in range(k):
c[i] ^= 1 << b[j] - 1
dp = [[10 ** 18] * (1 << n) for i in range(m + 1)]
dp[0][0] = 0
for i in range(m):
for j in range(1 << n):
if dp[i][j] >= 10 ** 18:
continue
t, val = c[i - 1], a[i - 1]
dp[i + 1][j | t] = min(dp[i][j] + val, dp[i + 1][j | t])
dp[i + 1][j] = min(dp[i + 1][j], dp[i][j])
ans = dp[m][(1 << n) - 1]
if ans >= 10 ** 18:
print(-1)
else:
print(ans)
if __name__ == "__main__":
main()
F - Pure
求最小环,简单的bfs就好
什么tarjan的都弱爆了
# -*- coding: utf-8 -*-
# @time : 2023/6/2 13:30
# @author : yhdu@tongwoo.cn
# @desc :
# @file : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(50050)
def main():
items = sys.version.split()
if items[0] == '3.10.6':
fp = open("in.txt")
else:
fp = sys.stdin
n, m = map(int, fp.readline().split())
g = [[] for _ in range(n)]
for i in range(m):
a, b = map(int, fp.readline().split())
a -= 1
b -= 1
g[a].append(b)
dist = [[10 ** 18] * n for i in range(n)]
pre = [[-1] * n for i in range(n)]
for i in range(n):
vis = [0] * n
qu = deque()
qu.append(i)
dist[i][i] = 0
while qu:
cur = qu.popleft()
for v in g[cur]:
if vis[v] == 0:
vis[v] = 1
qu.append(v)
dist[i][v] = dist[i][cur] + 1
pre[i][v] = cur
ans = 10 ** 18
sel = -1
for i in range(n):
if dist[i][i] != 0:
if dist[i][i] < ans:
ans, sel = dist[i][i], i
if ans == 10 ** 18:
print(-1)
else:
print(ans)
cur = sel
for i in range(ans):
print(cur + 1)
cur = pre[sel][cur]
if __name__ == "__main__":
main()