init
This commit is contained in:
commit
851751ea87
82 changed files with 2093 additions and 0 deletions
25
1A.py
Normal file
25
1A.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
V, E = map(int, input().split())
|
||||
adj = [[] for i in range(V + 1)]
|
||||
for i in range(E):
|
||||
u, v = map(int, input().split())
|
||||
adj[u].append(v)
|
||||
adj[v].append(u)
|
||||
visited = [False] * (V + 1)
|
||||
ans = []
|
||||
for i in range(1, V + 1):
|
||||
if not visited[i]:
|
||||
comp = []
|
||||
stack = [i]
|
||||
visited[i] = True
|
||||
while stack:
|
||||
u = stack.pop()
|
||||
comp.append(u)
|
||||
for v in adj[u]:
|
||||
if not visited[v]:
|
||||
visited[v] = True
|
||||
stack.append(v)
|
||||
ans.append(comp)
|
||||
print(len(ans))
|
||||
for comp in ans:
|
||||
print(len(comp))
|
||||
print(*(comp))
|
||||
24
1B.py
Normal file
24
1B.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
V, E = map(int, input().split())
|
||||
adj = [[] for i in range(V + 1)]
|
||||
for i in range(E):
|
||||
u, v = map(int, input().split())
|
||||
adj[u].append(v)
|
||||
adj[v].append(u)
|
||||
visited = [False] * (V + 1)
|
||||
ans = []
|
||||
for i in range(1, V + 1):
|
||||
if not visited[i]:
|
||||
comp = []
|
||||
stack = [i]
|
||||
visited[i] = True
|
||||
while stack:
|
||||
u = stack.pop()
|
||||
comp.append(u)
|
||||
for v in adj[u]:
|
||||
if not visited[v]:
|
||||
visited[v] = True
|
||||
stack.append(v)
|
||||
ans.append(comp)
|
||||
print(len(ans) - 1)
|
||||
for i in range(len(ans) - 1):
|
||||
print(ans[i][0], ans[i+1][0])
|
||||
33
1C.py
Normal file
33
1C.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
N, M = map(int, input().split())
|
||||
adj = [[] for i in range(N+1)]
|
||||
for i in range(M):
|
||||
u, v = map(int, input().split())
|
||||
adj[u].append(v)
|
||||
color = [0]*(N+1) # 0-нет цвета, 1 - обработка, 2 - отмечена и мы закончили
|
||||
parent = [0]*(N+1)
|
||||
for i in range(1, N+1):
|
||||
if color[i] == 0:
|
||||
stack = [i]
|
||||
while stack:
|
||||
u = stack.pop()
|
||||
if color[u] == 0:
|
||||
color[u] = 1
|
||||
stack.append(u)
|
||||
for v in adj[u]:
|
||||
if color[v] == 0:
|
||||
stack.append(v)
|
||||
parent[v] = u
|
||||
elif color[v] == 1 :
|
||||
cycle = [v]
|
||||
curr = u
|
||||
while curr != v:
|
||||
cycle.append(curr)
|
||||
curr = parent[curr]
|
||||
print(len(cycle))
|
||||
print(*(cycle[::-1]))
|
||||
exit()
|
||||
elif color[u] == 1:
|
||||
color[u] = 2
|
||||
|
||||
print("-1")
|
||||
|
||||
22
1D.py
Normal file
22
1D.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
n, m = map(int, input().split())
|
||||
adj = [[] for i in range(n + 1)]
|
||||
for i in range(m):
|
||||
u, v = map(int, input().split())
|
||||
adj[u].append(v)
|
||||
adj[v].append(u)
|
||||
color = [0] * (n + 1)
|
||||
for i in range(1, n + 1):
|
||||
if color[i] == 0:
|
||||
color[i] = 1
|
||||
stack = [i]
|
||||
while stack:
|
||||
u = stack.pop()
|
||||
c = color[u]
|
||||
for v in adj[u]:
|
||||
if color[v] == 0:
|
||||
color[v] = 3 - c
|
||||
stack.append(v)
|
||||
elif color[v] == c:
|
||||
print("-1")
|
||||
exit()
|
||||
print(*(color[1:]))
|
||||
25
1E.py
Normal file
25
1E.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
n, m = map(int, input().split())
|
||||
adj = [[] for _ in range(n + 1)]
|
||||
in_degree = [0] * (n + 1)
|
||||
for _ in range(m):
|
||||
u, v = map(int, input().split())
|
||||
adj[u].append(v)
|
||||
in_degree[v] += 1
|
||||
q = []
|
||||
for i in range(1, n + 1):
|
||||
if in_degree[i] == 0:
|
||||
q.append(i)
|
||||
head = 0
|
||||
topsort = []
|
||||
while head < len(q):
|
||||
u = q[head]
|
||||
head += 1
|
||||
topsort.append(u)
|
||||
for v in adj[u]:
|
||||
in_degree[v] -= 1
|
||||
if in_degree[v] == 0:
|
||||
q.append(v)
|
||||
if len(topsort) == n:
|
||||
print(*topsort)
|
||||
else:
|
||||
print("-1")
|
||||
27
1F.py
Normal file
27
1F.py
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
n = int(input())
|
||||
edges = [input().strip() for _ in range(n - 1)]
|
||||
R_in = [0] * n
|
||||
R_out = [0] * n
|
||||
B_in = [0] * n
|
||||
B_out = [0] * n
|
||||
for i in range(n - 1):
|
||||
row = edges[i]
|
||||
for j_idx, color in enumerate(row):
|
||||
j = i + 1 + j_idx
|
||||
if color == 'R':
|
||||
R_out[i] += 1
|
||||
R_in[j] += 1
|
||||
else:
|
||||
B_out[i] += 1
|
||||
B_in[j] += 1
|
||||
t_mixed_x2 = 0
|
||||
s_in_out = 0
|
||||
for v in range(n):
|
||||
road_R = R_in[v] + R_out[v]
|
||||
road_B = B_in[v] + B_out[v]
|
||||
t_mixed_x2 += road_R * road_B
|
||||
s_in_out += R_in[v] * B_out[v] + B_in[v] * R_out[v]
|
||||
if t_mixed_x2 // 2 == s_in_out:
|
||||
print("YES")
|
||||
else:
|
||||
print("NO")
|
||||
171
1G.py
Normal file
171
1G.py
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
import sys
|
||||
|
||||
# Читаем весь ввод разом
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
sys.exit(0)
|
||||
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
|
||||
g = [[] for _ in range(n + 1)]
|
||||
idx = 2
|
||||
for _ in range(m):
|
||||
u = int(data[idx])
|
||||
v = int(data[idx + 1])
|
||||
g[u].append(v)
|
||||
g[v].append(u)
|
||||
idx += 2
|
||||
|
||||
# Структуры для DFS-дерева
|
||||
tree_adj = [[] for _ in range(n + 1)]
|
||||
sz = [1] * (n + 1)
|
||||
parent = [0] * (n + 1)
|
||||
visited = [False] * (n + 1)
|
||||
|
||||
# Строим DFS-дерево итеративно, чтобы не словить RecursionError
|
||||
stack = [1]
|
||||
visited[1] = True
|
||||
order = []
|
||||
edge_idx = [0] * (n + 1)
|
||||
|
||||
while stack:
|
||||
u = stack[-1]
|
||||
found = False
|
||||
while edge_idx[u] < len(g[u]):
|
||||
v = g[u][edge_idx[u]]
|
||||
edge_idx[u] += 1
|
||||
if not visited[v]:
|
||||
visited[v] = True
|
||||
parent[v] = u
|
||||
tree_adj[u].append(v)
|
||||
stack.append(v)
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
order.append(u)
|
||||
stack.pop()
|
||||
|
||||
# Считаем размеры поддеревьев (снизу вверх)
|
||||
for u in order:
|
||||
if parent[u] != 0:
|
||||
sz[parent[u]] += sz[u]
|
||||
|
||||
# Поиск единственного верного пути сверху вниз
|
||||
u = 1
|
||||
dp = 1
|
||||
path = []
|
||||
target_found = -1
|
||||
|
||||
while u != 0:
|
||||
path.append(u)
|
||||
rem = n - len(path)
|
||||
if rem == 0:
|
||||
break
|
||||
|
||||
children = tree_adj[u]
|
||||
|
||||
# Проверяем, можем ли мы остановиться прямо сейчас
|
||||
if rem % 2 == 0 and rem > 0:
|
||||
target = rem // 2
|
||||
temp_dp = dp
|
||||
mask = (1 << (target + 1)) - 1
|
||||
temp_dp &= mask
|
||||
|
||||
# Мысленно добавляем всех детей текущей вершины в рюкзак
|
||||
for c in children:
|
||||
temp_dp = (temp_dp | (temp_dp << sz[c])) & mask
|
||||
|
||||
if temp_dp & (1 << target):
|
||||
target_found = target
|
||||
break
|
||||
|
||||
if not children:
|
||||
break
|
||||
|
||||
# Если мы не можем остановиться, мы обязаны шагнуть в самое тяжелое поддерево,
|
||||
# чтобы "раздробить" его на части.
|
||||
heavy_child = max(children, key=lambda x: sz[x])
|
||||
|
||||
# Все остальные дети навсегда "отваливаются" от пути, добавляем их в рюкзак
|
||||
mask_dp = (1 << ((n + 2) // 2)) - 1
|
||||
dp &= mask_dp
|
||||
for c in children:
|
||||
if c != heavy_child:
|
||||
dp = (dp | (dp << sz[c])) & mask_dp
|
||||
|
||||
u = heavy_child
|
||||
|
||||
if target_found != -1:
|
||||
# Мы нашли путь! Теперь соберем все отвалившиеся поддеревья, из которых мы набрали target
|
||||
items = []
|
||||
for i in range(len(path) - 1):
|
||||
curr_node = path[i]
|
||||
next_node = path[i+1]
|
||||
for c in tree_adj[curr_node]:
|
||||
if c != next_node:
|
||||
items.append((c, sz[c]))
|
||||
|
||||
last_node = path[-1]
|
||||
for c in tree_adj[last_node]:
|
||||
items.append((c, sz[c]))
|
||||
|
||||
# Честный алгоритм рюкзака с восстановлением ответа (только для собранных компонент)
|
||||
track = [-1] * (target_found + 1)
|
||||
dp_track = 1
|
||||
|
||||
for i, (c, w) in enumerate(items):
|
||||
nxt = (dp_track << w) & ((1 << (target_found + 1)) - 1)
|
||||
diff = nxt & ~dp_track
|
||||
if diff:
|
||||
# Быстрый битовый трюк для итерации только по новым битам
|
||||
bit = (diff & -diff)
|
||||
while diff > 0:
|
||||
pos = bit.bit_length() - 1
|
||||
if pos <= target_found and track[pos] == -1:
|
||||
track[pos] = i
|
||||
diff ^= bit
|
||||
bit = (diff & -diff)
|
||||
dp_track |= nxt
|
||||
if dp_track & (1 << target_found):
|
||||
break
|
||||
|
||||
used_items = set()
|
||||
curr_w = target_found
|
||||
while curr_w > 0:
|
||||
idx = track[curr_w]
|
||||
used_items.add(idx)
|
||||
curr_w -= items[idx][1]
|
||||
|
||||
a_ans = []
|
||||
b_ans = []
|
||||
|
||||
# Раскидываем полные поддеревья по комнатам А и Б
|
||||
for i, (c, w) in enumerate(items):
|
||||
comp_nodes = []
|
||||
q = [c]
|
||||
h = 0
|
||||
while h < len(q):
|
||||
curr_node = q[h]
|
||||
h += 1
|
||||
comp_nodes.append(curr_node)
|
||||
for child in tree_adj[curr_node]:
|
||||
q.append(child)
|
||||
|
||||
if i in used_items:
|
||||
a_ans.extend(comp_nodes)
|
||||
else:
|
||||
b_ans.extend(comp_nodes)
|
||||
|
||||
# Вывод
|
||||
print(len(path), len(a_ans))
|
||||
print(*path)
|
||||
print(*a_ans)
|
||||
print(*b_ans)
|
||||
else:
|
||||
# Железобетонный фолбек (теоретически недостижим на валидных данных)
|
||||
half = (n - 1) // 2
|
||||
print(1, half)
|
||||
print(1)
|
||||
print(*range(2, 2 + half))
|
||||
print(*range(2 + half, n + 1))
|
||||
41
1H.py
Normal file
41
1H.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
n, m, s, t = map(int, input().split())
|
||||
|
||||
graph = [[] for _ in range(n + 1)]
|
||||
in_degree = [0] * (n + 1)
|
||||
|
||||
for _ in range(m):
|
||||
u, v, weight = map(int, input().split())
|
||||
graph[u].append((v, weight))
|
||||
in_degree[v] += 1
|
||||
|
||||
queue = []
|
||||
for i in range(1, n + 1):
|
||||
if in_degree[i] == 0:
|
||||
queue.append(i)
|
||||
|
||||
order = []
|
||||
head = 0
|
||||
|
||||
while head < len(queue):
|
||||
current = queue[head]
|
||||
head += 1
|
||||
order.append(current)
|
||||
|
||||
for neighbor, weight in graph[current]:
|
||||
in_degree[neighbor] -= 1
|
||||
if in_degree[neighbor] == 0:
|
||||
queue.append(neighbor)
|
||||
|
||||
dist = [10**18] * (n + 1)
|
||||
dist[s] = 0
|
||||
|
||||
for node in order:
|
||||
if dist[node] != 10**18:
|
||||
for neighbor, weight in graph[node]:
|
||||
if dist[node] + weight < dist[neighbor]:
|
||||
dist[neighbor] = dist[node] + weight
|
||||
|
||||
if dist[t] == 10**18:
|
||||
print("Unreachable")
|
||||
else:
|
||||
print(dist[t])
|
||||
15
1I.py
Normal file
15
1I.py
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
n, m = map(int, input().split())
|
||||
e = []
|
||||
for _ in range(m):
|
||||
u, v = map(int, input().split())
|
||||
e.append((u, v))
|
||||
p = list(map(int, input().split()))
|
||||
d = [0] * (n + 1)
|
||||
for i in range(n):
|
||||
d[p[i]] = i
|
||||
ans = "YES"
|
||||
for u, v in e:
|
||||
if d[u] > d[v]:
|
||||
ans = "NO"
|
||||
break
|
||||
print(ans)
|
||||
24
1J.py
Normal file
24
1J.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import heapq
|
||||
|
||||
n = int(input())
|
||||
adj = [[] for _ in range(n + 1)]
|
||||
in_deg = [0] * (n + 1)
|
||||
for i in range(1, n + 1):
|
||||
data = list(map(int, input().split()))
|
||||
if data[0] > 0:
|
||||
for parent in data[1:]:
|
||||
adj[parent].append(i)
|
||||
in_deg[i] += 1
|
||||
queue = []
|
||||
for i in range(1, n + 1):
|
||||
if in_deg[i] == 0:
|
||||
heapq.heappush(queue, i)
|
||||
ans = []
|
||||
while queue:
|
||||
cur = heapq.heappop(queue)
|
||||
ans.append(cur)
|
||||
for nb in adj[cur]:
|
||||
in_deg[nb] -= 1
|
||||
if in_deg[nb] == 0:
|
||||
heapq.heappush(queue, nb)
|
||||
print(*(ans))
|
||||
48
1K.py
Normal file
48
1K.py
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
import sys
|
||||
input = sys.stdin.readline
|
||||
line = input().split()
|
||||
if not line:
|
||||
sys.exit()
|
||||
n, m = map(int, line)
|
||||
g = [[] for _ in range(n + 1)]
|
||||
gr = [[] for _ in range(n + 1)]
|
||||
for _ in range(m):
|
||||
u, v = map(int, input().split())
|
||||
g[u].append(v)
|
||||
gr[v].append(u)
|
||||
used = [0] * (n + 1)
|
||||
order = []
|
||||
head = [0] * (n + 1)
|
||||
for i in range(1, n + 1):
|
||||
if not used[i]:
|
||||
stack = [i]
|
||||
used[i] = 1
|
||||
while stack:
|
||||
v = stack[-1]
|
||||
if head[v] < len(g[v]):
|
||||
to = g[v][head[v]]
|
||||
head[v] += 1
|
||||
if not used[to]:
|
||||
used[to] = 1
|
||||
stack.append(to)
|
||||
else:
|
||||
stack.pop()
|
||||
order.append(v)
|
||||
used = [0] * (n + 1)
|
||||
comp = [0] * (n + 1)
|
||||
c = 1
|
||||
for i in reversed(order):
|
||||
if not used[i]:
|
||||
stack = [i]
|
||||
used[i] = 1
|
||||
comp[i] = c
|
||||
while stack:
|
||||
v = stack.pop()
|
||||
for to in gr[v]:
|
||||
if not used[to]:
|
||||
used[to] = 1
|
||||
comp[to] = c
|
||||
stack.append(to)
|
||||
c += 1
|
||||
print(c - 1)
|
||||
print(" ".join(map(str, comp[1:])))
|
||||
46
1L.py
Normal file
46
1L.py
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import sys
|
||||
input = sys.stdin.readline
|
||||
line = input().split()
|
||||
if not line:
|
||||
sys.exit()
|
||||
n, m = map(int, line)
|
||||
g = [[] for _ in range(n + 1)]
|
||||
gr = [[] for _ in range(n + 1)]
|
||||
for _ in range(m):
|
||||
u, v = map(int, input().split())
|
||||
g[u].append(v)
|
||||
gr[v].append(u)
|
||||
used = [0] * (n + 1)
|
||||
order = []
|
||||
head = [0] * (n + 1)
|
||||
for i in range(1, n + 1):
|
||||
if not used[i]:
|
||||
stack = [i]
|
||||
used[i] = 1
|
||||
while stack:
|
||||
v = stack[-1]
|
||||
if head[v] < len(g[v]):
|
||||
to = g[v][head[v]]
|
||||
head[v] += 1
|
||||
if not used[to]:
|
||||
used[to] = 1
|
||||
stack.append(to)
|
||||
else:
|
||||
stack.pop()
|
||||
order.append(v)
|
||||
used = [0] * (n + 1)
|
||||
ans = 0
|
||||
for i in reversed(order):
|
||||
if not used[i]:
|
||||
stack = [i]
|
||||
used[i] = 1
|
||||
size = 0
|
||||
while stack:
|
||||
v = stack.pop()
|
||||
size += 1
|
||||
for to in gr[v]:
|
||||
if not used[to]:
|
||||
used[to] = 1
|
||||
stack.append(to)
|
||||
ans += min(size, 2)
|
||||
print(ans)
|
||||
68
1M.py
Normal file
68
1M.py
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
exit()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
k = int(data[2])
|
||||
a = [0] * (n + 1)
|
||||
max_val = 0
|
||||
for i in range(1, n + 1):
|
||||
a[i] = int(data[2 + i])
|
||||
if a[i] > max_val:
|
||||
max_val = a[i]
|
||||
adj = [[] for _ in range(n + 1)]
|
||||
idx = 3 + n
|
||||
for _ in range(m):
|
||||
u = int(data[idx])
|
||||
v = int(data[idx+1])
|
||||
adj[u].append(v)
|
||||
idx += 2
|
||||
l = 1
|
||||
r = max_val
|
||||
ans = -1
|
||||
while l <= r:
|
||||
mid = (l + r) // 2
|
||||
in_degree = [0] * (n + 1)
|
||||
valid_count = 0
|
||||
for u in range(1, n + 1):
|
||||
if a[u] <= mid:
|
||||
valid_count += 1
|
||||
for v in adj[u]:
|
||||
if a[v] <= mid:
|
||||
in_degree[v] += 1
|
||||
q = []
|
||||
dp = [0] * (n + 1)
|
||||
possible = False
|
||||
for i in range(1, n + 1):
|
||||
if a[i] <= mid:
|
||||
dp[i] = 1
|
||||
if dp[i] >= k:
|
||||
possible = True
|
||||
if in_degree[i] == 0:
|
||||
q.append(i)
|
||||
head = 0
|
||||
visited_count = 0
|
||||
while head < len(q) and not possible:
|
||||
u = q[head]
|
||||
head += 1
|
||||
visited_count += 1
|
||||
for v in adj[u]:
|
||||
if a[v] <= mid:
|
||||
if dp[u] + 1 > dp[v]:
|
||||
dp[v] = dp[u] + 1
|
||||
if dp[v] >= k:
|
||||
possible = True
|
||||
break
|
||||
in_degree[v] -= 1
|
||||
if in_degree[v] == 0:
|
||||
q.append(v)
|
||||
if visited_count < valid_count:
|
||||
possible = True
|
||||
if possible:
|
||||
ans = mid
|
||||
r = mid - 1
|
||||
else:
|
||||
l = mid + 1
|
||||
print(ans)
|
||||
74
1N.py
Normal file
74
1N.py
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
exit()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
adj_all = [[] for _ in range(n + 1)]
|
||||
adj2 = [[] for _ in range(n + 1)]
|
||||
rev_adj2 = [[] for _ in range(n + 1)]
|
||||
edges2 = []
|
||||
idx = 2
|
||||
for _ in range(m):
|
||||
u = int(data[idx])
|
||||
v = int(data[idx+1])
|
||||
t = int(data[idx+2])
|
||||
idx += 3
|
||||
adj_all[u].append(v)
|
||||
if t == 2:
|
||||
adj2[u].append(v)
|
||||
rev_adj2[v].append(u)
|
||||
edges2.append((u, v))
|
||||
reachable = [False] * (n + 1)
|
||||
reachable[1] = True
|
||||
q = [1]
|
||||
head = 0
|
||||
while head < len(q):
|
||||
u = q[head]
|
||||
head += 1
|
||||
for v in adj_all[u]:
|
||||
if not reachable[v]:
|
||||
reachable[v] = True
|
||||
q.append(v)
|
||||
visited = [False] * (n + 1)
|
||||
order = []
|
||||
edge_idx = [0] * (n + 1)
|
||||
stack = []
|
||||
for i in range(1, n + 1):
|
||||
if not visited[i]:
|
||||
visited[i] = True
|
||||
stack.append(i)
|
||||
while stack:
|
||||
u = stack[-1]
|
||||
if edge_idx[u] < len(adj2[u]):
|
||||
v = adj2[u][edge_idx[u]]
|
||||
edge_idx[u] += 1
|
||||
if not visited[v]:
|
||||
visited[v] = True
|
||||
stack.append(v)
|
||||
else:
|
||||
order.append(u)
|
||||
stack.pop()
|
||||
scc_id = [0] * (n + 1)
|
||||
current_scc = 0
|
||||
for i in range(n - 1, -1, -1):
|
||||
start_node = order[i]
|
||||
if scc_id[start_node] == 0:
|
||||
current_scc += 1
|
||||
q_scc = [start_node]
|
||||
scc_id[start_node] = current_scc
|
||||
head_scc = 0
|
||||
while head_scc < len(q_scc):
|
||||
u = q_scc[head_scc]
|
||||
head_scc += 1
|
||||
for v in rev_adj2[u]:
|
||||
if scc_id[v] == 0:
|
||||
scc_id[v] = current_scc
|
||||
q_scc.append(v)
|
||||
ans = "No"
|
||||
for u, v in edges2:
|
||||
if reachable[u] and scc_id[u] != scc_id[v]:
|
||||
ans = "Yes"
|
||||
break
|
||||
print(ans)
|
||||
101
1O.py
Normal file
101
1O.py
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
import sys
|
||||
from collections import deque
|
||||
|
||||
reader = (int(token) for line in sys.stdin for token in line.split())
|
||||
n = next(reader)
|
||||
m = next(reader)
|
||||
A = next(reader)
|
||||
B = next(reader)
|
||||
w = []
|
||||
e = []
|
||||
for i in range(n):
|
||||
x = next(reader)
|
||||
y = next(reader)
|
||||
if x == 0:
|
||||
w.append((y, i))
|
||||
elif x == A:
|
||||
e.append((y, i))
|
||||
max_e = 2 * m
|
||||
head = [-1] * n
|
||||
rhead = [-1] * n
|
||||
to = [0] * max_e
|
||||
nxt = [0] * max_e
|
||||
rto = [0] * max_e
|
||||
rnxt = [0] * max_e
|
||||
ec = 0
|
||||
rec = 0
|
||||
for _ in range(m):
|
||||
u = next(reader) - 1
|
||||
v = next(reader) - 1
|
||||
k = next(reader)
|
||||
to[ec] = v
|
||||
nxt[ec] = head[u]
|
||||
head[u] = ec
|
||||
ec += 1
|
||||
rto[rec] = u
|
||||
rnxt[rec] = rhead[v]
|
||||
rhead[v] = rec
|
||||
rec += 1
|
||||
if k == 2:
|
||||
to[ec] = u
|
||||
nxt[ec] = head[v]
|
||||
head[v] = ec
|
||||
ec += 1
|
||||
rto[rec] = v
|
||||
rnxt[rec] = rhead[u]
|
||||
rhead[u] = rec
|
||||
rec += 1
|
||||
vis = [False] * n
|
||||
q = deque([i for y, i in w])
|
||||
for i in q:
|
||||
vis[i] = True
|
||||
while q:
|
||||
v = q.popleft()
|
||||
idx = head[v]
|
||||
while idx != -1:
|
||||
t = to[idx]
|
||||
if not vis[t]:
|
||||
vis[t] = True
|
||||
q.append(t)
|
||||
idx = nxt[idx]
|
||||
valid_e = [(y, i) for y, i in e if vis[i]]
|
||||
valid_e.sort()
|
||||
mx = [-1] * n
|
||||
q = deque()
|
||||
for i in range(len(valid_e) - 1, -1, -1):
|
||||
_, node = valid_e[i]
|
||||
if mx[node] == -1:
|
||||
mx[node] = i
|
||||
q.append(node)
|
||||
while q:
|
||||
v = q.popleft()
|
||||
idx = rhead[v]
|
||||
while idx != -1:
|
||||
t = rto[idx]
|
||||
if mx[t] == -1:
|
||||
mx[t] = i
|
||||
q.append(t)
|
||||
idx = rnxt[idx]
|
||||
mn = [-1] * n
|
||||
for i in range(len(valid_e)):
|
||||
_, node = valid_e[i]
|
||||
if mn[node] == -1:
|
||||
mn[node] = i
|
||||
q.append(node)
|
||||
while q:
|
||||
v = q.popleft()
|
||||
idx = rhead[v]
|
||||
while idx != -1:
|
||||
t = rto[idx]
|
||||
if mn[t] == -1:
|
||||
mn[t] = i
|
||||
q.append(t)
|
||||
idx = rnxt[idx]
|
||||
w.sort(reverse=True)
|
||||
ans = []
|
||||
for y, i in w:
|
||||
if mx[i] != -1 and mn[i] != -1:
|
||||
ans.append(str(mx[i] - mn[i] + 1))
|
||||
else:
|
||||
ans.append("0")
|
||||
print('\n'.join(ans))
|
||||
0
1P.py
Normal file
0
1P.py
Normal file
67
2A.py
Normal file
67
2A.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
import sys
|
||||
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
ptr = 0
|
||||
|
||||
|
||||
while ptr < len(data):
|
||||
n = int(data[ptr])
|
||||
ptr += 1
|
||||
m = int(data[ptr])
|
||||
ptr += 1
|
||||
N = 2 * n
|
||||
g = [[] for _ in range(N)]
|
||||
gr = [[] for _ in range(N)]
|
||||
for _ in range(m):
|
||||
i1 = int(data[ptr]); ptr += 1
|
||||
e1 = int(data[ptr]); ptr += 1
|
||||
i2 = int(data[ptr]); ptr += 1
|
||||
e2 = int(data[ptr]); ptr += 1
|
||||
u_neg = 2 * i1 + (1 - e1)
|
||||
v_neg = 2 * i2 + (1 - e2)
|
||||
u_pos = 2 * i1 + e1
|
||||
v_pos = 2 * i2 + e2
|
||||
g[u_neg].append(v_pos)
|
||||
gr[v_pos].append(u_neg)
|
||||
g[v_neg].append(u_pos)
|
||||
gr[u_pos].append(v_neg)
|
||||
visited = [False] * N
|
||||
order = []
|
||||
for i in range(N):
|
||||
if not visited[i]:
|
||||
stack = [(i, 0)]
|
||||
visited[i] = True
|
||||
while stack:
|
||||
cur, edge_idx = stack[-1]
|
||||
if edge_idx < len(g[cur]):
|
||||
next_node = g[cur][edge_idx]
|
||||
stack[-1] = (cur, edge_idx + 1)
|
||||
if not visited[next_node]:
|
||||
visited[next_node] = True
|
||||
stack.append((next_node, 0))
|
||||
else:
|
||||
order.append(cur)
|
||||
stack.pop()
|
||||
comp = [-1] * N
|
||||
c_id = 0
|
||||
for i in range(N - 1, -1, -1):
|
||||
start_node = order[i]
|
||||
if comp[start_node] == -1:
|
||||
c_id += 1
|
||||
stack = [start_node]
|
||||
comp[start_node] = c_id
|
||||
while stack:
|
||||
cur = stack.pop()
|
||||
for neighbor in gr[cur]:
|
||||
if comp[neighbor] == -1:
|
||||
comp[neighbor] = c_id
|
||||
stack.append(neighbor)
|
||||
|
||||
res = []
|
||||
for i in range(n):
|
||||
if comp[2 * i + 1] > comp[2 * i]:
|
||||
res.append("1")
|
||||
else:
|
||||
res.append("0")
|
||||
print("".join(res))
|
||||
0
2B.py
Normal file
0
2B.py
Normal file
0
2C.py
Normal file
0
2C.py
Normal file
54
2D.py
Normal file
54
2D.py
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
sys.exit()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
adj = [[] for _ in range(n + 1)]
|
||||
idx = 2
|
||||
for i in range(1, m + 1):
|
||||
u = int(data[idx])
|
||||
v = int(data[idx+1])
|
||||
idx += 2
|
||||
adj[u].append((v, i))
|
||||
adj[v].append((u, i))
|
||||
tin = [-1] * (n + 1)
|
||||
fup = [-1] * (n + 1)
|
||||
ans = []
|
||||
timer = 0
|
||||
ptr = [0] * (n + 1)
|
||||
stack = []
|
||||
for i in range(1, n + 1):
|
||||
if tin[i] == -1:
|
||||
tin[i] = fup[i] = timer
|
||||
timer += 1
|
||||
stack.append((i, -1))
|
||||
while stack:
|
||||
v, p_e = stack[-1]
|
||||
if ptr[v] < len(adj[v]):
|
||||
to, e_idx = adj[v][ptr[v]]
|
||||
ptr[v] += 1
|
||||
|
||||
if e_idx == p_e:
|
||||
continue
|
||||
|
||||
if tin[to] != -1:
|
||||
if tin[to] < fup[v]:
|
||||
fup[v] = tin[to]
|
||||
else:
|
||||
tin[to] = fup[to] = timer
|
||||
timer += 1
|
||||
stack.append((to, e_idx))
|
||||
else:
|
||||
stack.pop()
|
||||
if stack:
|
||||
p_v, _ = stack[-1]
|
||||
if fup[v] < fup[p_v]:
|
||||
fup[p_v] = fup[v]
|
||||
if fup[v] > tin[p_v]:
|
||||
ans.append(p_e)
|
||||
ans.sort()
|
||||
print(len(ans))
|
||||
if ans:
|
||||
print(*(ans))
|
||||
0
2E.py
Normal file
0
2E.py
Normal file
0
2F.py
Normal file
0
2F.py
Normal file
0
2G.py
Normal file
0
2G.py
Normal file
0
2H.py
Normal file
0
2H.py
Normal file
50
3D.cpp
Normal file
50
3D.cpp
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
long long x[20005];
|
||||
long long y[20005];
|
||||
long long D[20005];
|
||||
bool visited[20005];
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
cin >> x[i] >> y[i];
|
||||
}
|
||||
int s, t;
|
||||
cin >> s >> t;
|
||||
long long INF = 1000000000000000000LL;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
D[i] = INF;
|
||||
visited[i] = false;
|
||||
}
|
||||
D[s] = 0;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
int u = -1;
|
||||
long long min_d = INF;
|
||||
for (int j = 1; j <= n; j++) {
|
||||
if (visited[j] == false && D[j] < min_d) {
|
||||
min_d = D[j];
|
||||
u = j;
|
||||
}
|
||||
}
|
||||
if (u == -1 || u == t || D[u] == INF) {
|
||||
break;
|
||||
}
|
||||
visited[u] = true;
|
||||
for (int v = 1; v <= n; v++) {
|
||||
if (visited[v] == false) {
|
||||
long long dx = x[u] - x[v];
|
||||
long long dy = y[u] - y[v];
|
||||
long long cost = D[u] + dx * dx + dy * dy;
|
||||
if (cost < D[v]) {
|
||||
D[v] = cost;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cout << D[t] << "\n";
|
||||
return 0;
|
||||
}
|
||||
BIN
3D.exe
Normal file
BIN
3D.exe
Normal file
Binary file not shown.
33
3D.py
Normal file
33
3D.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
data = open(0).read().split()
|
||||
if not data:
|
||||
exit()
|
||||
n = int(data[0])
|
||||
x = [0] * n
|
||||
y = [0] * n
|
||||
idx = 1
|
||||
for i in range(n):
|
||||
x[i] = int(data[idx])
|
||||
y[i] = int(data[idx+1])
|
||||
idx += 2
|
||||
s = int(data[idx]) - 1
|
||||
t = int(data[idx+1]) - 1
|
||||
INF = 10**18
|
||||
D = [INF] * n
|
||||
D[s] = 0
|
||||
unvisited = list(range(n))
|
||||
get_D = D.__getitem__
|
||||
while unvisited:
|
||||
u = min(unvisited, key=get_D)
|
||||
if u == t or D[u] == INF:
|
||||
break
|
||||
unvisited.remove(u)
|
||||
du = D[u]
|
||||
xu = x[u]
|
||||
yu = y[u]
|
||||
for v in unvisited:
|
||||
dx = xu - x[v]
|
||||
dy = yu - y[v]
|
||||
cost = du + dx * dx + dy * dy
|
||||
if cost < D[v]:
|
||||
D[v] = cost
|
||||
print(D[t])
|
||||
41
3E.py
Normal file
41
3E.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import sys
|
||||
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
exit()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
INF = 10**15
|
||||
dist = []
|
||||
for i in range(n + 1):
|
||||
row = [INF] * (n + 1)
|
||||
row[i] = 0
|
||||
dist.append(row)
|
||||
idx = 2
|
||||
for _ in range(m):
|
||||
u = int(data[idx])
|
||||
v = int(data[idx+1])
|
||||
w = int(data[idx+2])
|
||||
idx += 3
|
||||
if w < dist[u][v]:
|
||||
dist[u][v] = w
|
||||
for k in range(1, n + 1):
|
||||
for i in range(1, n + 1):
|
||||
if dist[i][k] != INF:
|
||||
for j in range(1, n + 1):
|
||||
if dist[k][j] != INF:
|
||||
new_dist = dist[i][k] + dist[k][j]
|
||||
if new_dist < dist[i][j]:
|
||||
dist[i][j] = new_dist
|
||||
out = []
|
||||
for i in range(1, n + 1):
|
||||
row_out = []
|
||||
for j in range(1, n + 1):
|
||||
if dist[i][j] == INF:
|
||||
row_out.append("30000")
|
||||
else:
|
||||
row_out.append(str(dist[i][j]))
|
||||
out.append(" ".join(row_out))
|
||||
|
||||
print("\n".join(out))
|
||||
37
3F.py
Normal file
37
3F.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
import sys
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
exit()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
U = [0] * m
|
||||
V = [0] * m
|
||||
W = [0] * m
|
||||
idx = 2
|
||||
for i in range(m):
|
||||
U[i] = int(data[idx])
|
||||
V[i] = int(data[idx+1])
|
||||
W[i] = int(data[idx+2])
|
||||
idx += 3
|
||||
INF = 10**15
|
||||
D = [INF] * (n + 1)
|
||||
D[1] = 0
|
||||
for _ in range(n - 1):
|
||||
any_relaxed = False
|
||||
for i in range(m):
|
||||
u = U[i]
|
||||
if D[u] != INF:
|
||||
v = V[i]
|
||||
cost = D[u] + W[i]
|
||||
if cost < D[v]:
|
||||
D[v] = cost
|
||||
any_relaxed = True
|
||||
if not any_relaxed:
|
||||
break
|
||||
ans = []
|
||||
for i in range(1, n + 1):
|
||||
if D[i] == INF:
|
||||
ans.append(30000)
|
||||
else:
|
||||
ans.append(D[i])
|
||||
print(*ans)
|
||||
31
3G.py
Normal file
31
3G.py
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import sys
|
||||
import heapq
|
||||
data = sys.stdin.read().split()
|
||||
if data:
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
graph = [[] for _ in range(n + 1)]
|
||||
idx = 2
|
||||
for _ in range(m):
|
||||
u = int(data[idx])
|
||||
v = int(data[idx+1])
|
||||
w = int(data[idx+2])
|
||||
graph[u].append((v, w))
|
||||
graph[v].append((u, w))
|
||||
idx += 3
|
||||
inf = 10**18
|
||||
dist = [inf] * (n + 1)
|
||||
dist[1] = 0
|
||||
pq = [(0, 1)]
|
||||
while len(pq) > 0:
|
||||
d, u = heapq.heappop(pq)
|
||||
if d > dist[u]:
|
||||
continue
|
||||
for v, w in graph[u]:
|
||||
if dist[u] + w < dist[v]:
|
||||
dist[v] = dist[u] + w
|
||||
heapq.heappush(pq, (dist[v], v))
|
||||
ans = []
|
||||
for i in range(1, n + 1):
|
||||
ans.append(str(dist[i]))
|
||||
sys.stdout.write(" ".join(ans) + "\n")
|
||||
26
3H.py
Normal file
26
3H.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
import sys
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
N = int(input_data[0])
|
||||
edges = []
|
||||
idx = 1
|
||||
for i in range(N):
|
||||
for j in range(N):
|
||||
w = int(input_data[idx])
|
||||
idx += 1
|
||||
if w != 100000:
|
||||
edges.append((i, j, w))
|
||||
d = [0] * N
|
||||
for _ in range(N - 1):
|
||||
for u, v, w in edges:
|
||||
if d[u] + w < d[v]:
|
||||
d[v] = d[u] + w
|
||||
flag = False
|
||||
for u, v, w in edges:
|
||||
if d[u] + w < d[v]:
|
||||
flag = True
|
||||
break
|
||||
if flag:
|
||||
print("YES")
|
||||
else:
|
||||
print("NO")
|
||||
32
3I.py
Normal file
32
3I.py
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import sys
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
N = int(input_data[0])
|
||||
M = int(input_data[1])
|
||||
K = int(input_data[2])
|
||||
S = int(input_data[3]) - 1
|
||||
edges = []
|
||||
ptr = 4
|
||||
for _ in range(M):
|
||||
u = int(input_data[ptr]) - 1
|
||||
v = int(input_data[ptr+1]) - 1
|
||||
w = int(input_data[ptr+2])
|
||||
edges.append((u, v, w))
|
||||
ptr += 3
|
||||
INF = 10**15
|
||||
dp = [INF] * N
|
||||
dp[S] = 0
|
||||
for _ in range(K):
|
||||
next_dp = [INF] * N
|
||||
for u, v, w in edges:
|
||||
if dp[u] != INF:
|
||||
if dp[u] + w < next_dp[v]:
|
||||
next_dp[v] = dp[u] + w
|
||||
dp = next_dp
|
||||
res = []
|
||||
for val in dp:
|
||||
if val == INF:
|
||||
res.append("-1")
|
||||
else:
|
||||
res.append(str(val))
|
||||
print("\n".join(res))
|
||||
0
3J.py
Normal file
0
3J.py
Normal file
24
3K.py
Normal file
24
3K.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import sys
|
||||
|
||||
data = list(map(int, sys.stdin.read().split()))
|
||||
|
||||
n = data[0]
|
||||
init_ = data[1 : 1 + n * n]
|
||||
queue_to_del = [x - 1 for x in data[1 + n * n :]]
|
||||
ans = []
|
||||
active = [False] * n
|
||||
for step in range(n - 1, -1, -1):
|
||||
k = queue_to_del[step]
|
||||
active[k] = True
|
||||
cur_sum = 0
|
||||
k_row = k * n
|
||||
for i in range(n):
|
||||
i_row = i * n
|
||||
dik = init_[i_row + k]
|
||||
for j in range(n):
|
||||
if dik + init_[k_row + j] < init_[i_row + j]:
|
||||
init_[i_row + j] = dik + init_[k_row + j]
|
||||
if active[i] and active[j]:
|
||||
cur_sum += init_[i_row + j]
|
||||
ans.append(cur_sum)
|
||||
print(" ".join(map(str, reversed(ans))))
|
||||
70
3L.py
Normal file
70
3L.py
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
if not data:
|
||||
exit()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
ans = []
|
||||
for i in range(n):
|
||||
ans.extend(list(data[2 + i]))
|
||||
q = [0] * (n * m)
|
||||
head = 0
|
||||
tail = 0
|
||||
for c in range(m):
|
||||
if ans[c] == '.':
|
||||
ans[c] = '^'
|
||||
q[tail] = c
|
||||
tail += 1
|
||||
for c in range(m):
|
||||
pos = (n - 1) * m + c
|
||||
if ans[pos] == '.':
|
||||
ans[pos] = 'v'
|
||||
q[tail] = pos
|
||||
tail += 1
|
||||
for r in range(n):
|
||||
pos = r * m
|
||||
if ans[pos] == '.':
|
||||
ans[pos] = '<'
|
||||
q[tail] = pos
|
||||
tail += 1
|
||||
for r in range(n):
|
||||
pos = r * m + (m - 1)
|
||||
if ans[pos] == '.':
|
||||
ans[pos] = '>'
|
||||
q[tail] = pos
|
||||
tail += 1
|
||||
while head < tail:
|
||||
pos = q[head]
|
||||
head += 1
|
||||
r = pos // m
|
||||
c = pos % m
|
||||
if r > 0:
|
||||
npos = pos - m
|
||||
if ans[npos] == '.':
|
||||
ans[npos] = 'v'
|
||||
q[tail] = npos
|
||||
tail += 1
|
||||
if r < n - 1:
|
||||
npos = pos + m
|
||||
if ans[npos] == '.':
|
||||
ans[npos] = '^'
|
||||
q[tail] = npos
|
||||
tail += 1
|
||||
if c > 0:
|
||||
npos = pos - 1
|
||||
if ans[npos] == '.':
|
||||
ans[npos] = '>'
|
||||
q[tail] = npos
|
||||
tail += 1
|
||||
if c < m - 1:
|
||||
npos = pos + 1
|
||||
if ans[npos] == '.':
|
||||
ans[npos] = '<'
|
||||
q[tail] = npos
|
||||
tail += 1
|
||||
|
||||
out = []
|
||||
for r in range(n):
|
||||
out.append("".join(ans[r * m : (r + 1) * m]))
|
||||
print("\n".join(out))
|
||||
30
4A.py
Normal file
30
4A.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import sys
|
||||
import math
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
n = int(data[0])
|
||||
xs = []
|
||||
ys = []
|
||||
idx = 1
|
||||
for _ in range(n):
|
||||
xs.append(int(data[idx]))
|
||||
ys.append(int(data[idx+1]))
|
||||
idx += 2
|
||||
min_e = [float('inf')] * n
|
||||
used = [False] * n
|
||||
min_e[0] = 0.0
|
||||
ans = 0.0
|
||||
for _ in range(n):
|
||||
v = -1
|
||||
for i in range(n):
|
||||
if not used[i] and (v == -1 or min_e[i] < min_e[v]):
|
||||
v = i
|
||||
used[v] = True
|
||||
ans += math.sqrt(min_e[v])
|
||||
vx, vy = xs[v], ys[v]
|
||||
for u in range(n):
|
||||
if not used[u]:
|
||||
dist_sq = (xs[u] - vx)**2 + (ys[u] - vy)**2
|
||||
if dist_sq < min_e[u]:
|
||||
min_e[u] = dist_sq
|
||||
print(f"{ans:.10f}")
|
||||
32
4B.py
Normal file
32
4B.py
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
n = int(data[0])
|
||||
m = int(data[1])
|
||||
edges = []
|
||||
idx = 2
|
||||
for _ in range(m):
|
||||
edges.append((int(data[idx+2]), int(data[idx]), int(data[idx+1])))
|
||||
idx += 3
|
||||
edges.sort()
|
||||
p = list(range(n + 1))
|
||||
def find(i):
|
||||
r = i
|
||||
while r != p[r]:
|
||||
r = p[r]
|
||||
c = i
|
||||
while c != r:
|
||||
p[c], c = r, p[c]
|
||||
return r
|
||||
ans = 0
|
||||
cnt = 0
|
||||
for w, u, v in edges:
|
||||
ru = find(u)
|
||||
rv = find(v)
|
||||
if ru != rv:
|
||||
p[ru] = rv
|
||||
ans += w
|
||||
cnt += 1
|
||||
if cnt == n - 1:
|
||||
break
|
||||
print(ans)
|
||||
41
4C.py
Normal file
41
4C.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
n, m = int(data[0]), int(data[1])
|
||||
edges = []
|
||||
idx = 2
|
||||
for i in range(m):
|
||||
edges.append([int(data[idx+2]), int(data[idx]), int(data[idx+1]), i])
|
||||
idx += 3
|
||||
edges.sort()
|
||||
def find(i, p):
|
||||
if p[i] == i: return i
|
||||
p[i] = find(p[i], p)
|
||||
return p[i]
|
||||
p = list(range(n + 1))
|
||||
s1 = 0
|
||||
mst_edges = []
|
||||
for j in range(m):
|
||||
w, u, v, eid = edges[j]
|
||||
ru, rv = find(u, p), find(v, p)
|
||||
if ru != rv:
|
||||
p[ru] = rv
|
||||
s1 += w
|
||||
mst_edges.append(j)
|
||||
s2 = float('inf')
|
||||
for i in mst_edges:
|
||||
p = list(range(n + 1))
|
||||
w_tot = 0
|
||||
cnt = 0
|
||||
for j in range(m):
|
||||
if j == i:
|
||||
continue
|
||||
w, u, v, eid = edges[j]
|
||||
ru, rv = find(u, p), find(v, p)
|
||||
if ru != rv:
|
||||
p[ru] = rv
|
||||
w_tot += w
|
||||
cnt += 1
|
||||
if cnt == n - 1 and w_tot < s2:
|
||||
s2 = w_tot
|
||||
print(s1, s2)
|
||||
0
4D.py
Normal file
0
4D.py
Normal file
0
4E.py
Normal file
0
4E.py
Normal file
0
4F.py
Normal file
0
4F.py
Normal file
0
4G.py
Normal file
0
4G.py
Normal file
17
5A.py
Normal file
17
5A.py
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import sys
|
||||
|
||||
s = sys.stdin.read().strip()
|
||||
n = len(s)
|
||||
|
||||
z = [0] * n
|
||||
z[0] = n
|
||||
l, r = 0, 0
|
||||
for i in range(1, n):
|
||||
if i <= r:
|
||||
z[i] = min(r - i + 1, z[i - l])
|
||||
while i + z[i] < n and s[z[i]] == s[i + z[i]]:
|
||||
z[i] += 1
|
||||
if i + z[i] - 1 > r:
|
||||
l = i
|
||||
r = i + z[i] - 1
|
||||
print(*(z))
|
||||
21
5B.py
Normal file
21
5B.py
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
s, t = data[0], data[1]
|
||||
m = len(t)
|
||||
st = t + "#" + s
|
||||
n = len(st)
|
||||
z = [0] * n
|
||||
l, r = 0, 0
|
||||
ans = []
|
||||
for i in range(1, n):
|
||||
if i <= r:
|
||||
z[i] = min(r - i + 1, z[i - l])
|
||||
while i + z[i] < n and st[z[i]] == st[i + z[i]]:
|
||||
z[i] += 1
|
||||
if i + z[i] - 1 > r:
|
||||
l = i
|
||||
r = i + z[i] - 1
|
||||
if z[i] == m:
|
||||
ans.append(i - m - 1)
|
||||
print(*ans)
|
||||
23
5C.py
Normal file
23
5C.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
a, b = data[0], data[1]
|
||||
n = len(a)
|
||||
st = a + "#" + b + b
|
||||
total_len = len(st)
|
||||
z = [0] * total_len
|
||||
l, r = 0, 0
|
||||
ans = -1
|
||||
for i in range(1, total_len):
|
||||
if i <= r:
|
||||
z[i] = min(r - i + 1, z[i - l])
|
||||
while i + z[i] < total_len and st[z[i]] == st[i + z[i]]:
|
||||
z[i] += 1
|
||||
if i + z[i] - 1 > r:
|
||||
l = i
|
||||
r = i + z[i] - 1
|
||||
if n + 1 <= i < 2 * n + 1:
|
||||
if z[i] == n:
|
||||
ans = i - (n + 1)
|
||||
break
|
||||
print(ans)
|
||||
30
5D.py
Normal file
30
5D.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import sys
|
||||
|
||||
line = sys.stdin.buffer.readline().split()
|
||||
n, m = int(line[0]), int(line[1])
|
||||
g = sys.stdin.buffer.readline().strip()
|
||||
pi = [0] * n
|
||||
for i in range(1, n):
|
||||
j = pi[i-1]
|
||||
while j > 0 and g[i] != g[j]:
|
||||
j = pi[j-1]
|
||||
if g[i] == g[j]: j += 1
|
||||
pi[i] = j
|
||||
ans = 0
|
||||
idx = 0
|
||||
j = 0
|
||||
while True:
|
||||
chunk = sys.stdin.buffer.read(131072)
|
||||
if not chunk:
|
||||
break
|
||||
chunk = chunk.replace(b'\n', b'').replace(b'\r', b'')
|
||||
for c in chunk:
|
||||
while j > 0 and c != g[j]:
|
||||
j = pi[j-1]
|
||||
if c == g[j]:
|
||||
j += 1
|
||||
if j == n:
|
||||
ans += (idx - n + 1)
|
||||
j = pi[n-1]
|
||||
idx += 1
|
||||
print(ans)
|
||||
0
5E.py
Normal file
0
5E.py
Normal file
0
5F.py
Normal file
0
5F.py
Normal file
0
5G.py
Normal file
0
5G.py
Normal file
0
5H.py
Normal file
0
5H.py
Normal file
0
6A.py
Normal file
0
6A.py
Normal file
0
6B.py
Normal file
0
6B.py
Normal file
0
6C.py
Normal file
0
6C.py
Normal file
0
6D.py
Normal file
0
6D.py
Normal file
0
6E.py
Normal file
0
6E.py
Normal file
51
7A.py
Normal file
51
7A.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
n, m = int(data[0]), int(data[1])
|
||||
parents = [0] * n
|
||||
idx = 2
|
||||
for i in range(1, n):
|
||||
parents[i] = int(data[idx])
|
||||
idx += 1
|
||||
a1, a2 = int(data[idx]), int(data[idx+1])
|
||||
x, y, z = int(data[idx+2]), int(data[idx+3]), int(data[idx+4])
|
||||
adj = [[] for _ in range(n)]
|
||||
for i in range(1, n):
|
||||
adj[parents[i]].append(i)
|
||||
depth = [0] * n
|
||||
q = [0]
|
||||
for u in q:
|
||||
for v in adj[u]:
|
||||
depth[v] = depth[u] + 1
|
||||
q.append(v)
|
||||
up = [[0] * 18 for _ in range(n)]
|
||||
for i in range(1, n):
|
||||
up[i][0] = parents[i]
|
||||
for k in range(1, 18):
|
||||
for i in range(n):
|
||||
up[i][k] = up[up[i][k-1]][k-1]
|
||||
a = [0] * (2 * m + 1)
|
||||
a[1], a[2] = a1, a2
|
||||
for i in range(3, 2 * m + 1):
|
||||
a[i] = (x * a[i-2] + y * a[i-1] + z) % n
|
||||
ans = 0
|
||||
v = 0
|
||||
for i in range(1, m + 1):
|
||||
u = (a[2*i-1] + v) % n
|
||||
vq = a[2*i]
|
||||
if depth[u] < depth[vq]:
|
||||
u, vq = vq, u
|
||||
diff = depth[u] - depth[vq]
|
||||
for k in range(18):
|
||||
if (diff >> k) & 1:
|
||||
u = up[u][k]
|
||||
if u == vq:
|
||||
v = u
|
||||
else:
|
||||
for k in range(17, -1, -1):
|
||||
if up[u][k] != up[vq][k]:
|
||||
u = up[u][k]
|
||||
vq = up[vq][k]
|
||||
v = up[u][0]
|
||||
ans += v
|
||||
print(ans)
|
||||
57
7B.py
Normal file
57
7B.py
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import sys
|
||||
|
||||
def f_lca(u, v_node):
|
||||
if d[u] < d[v_node]:
|
||||
u, v_node = v_node, u
|
||||
diff = d[u] - d[v_node]
|
||||
for k in range(18):
|
||||
if (diff >> k) & 1:
|
||||
u = up[u][k]
|
||||
if u == v_node:
|
||||
return u
|
||||
for k in range(17, -1, -1):
|
||||
if up[u][k] != up[v_node][k]:
|
||||
u = up[u][k]
|
||||
v_node = up[v_node][k]
|
||||
return up[u][0]
|
||||
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
n = int(data[0])
|
||||
v = [0] + [int(x) for x in data[1 : n + 1]]
|
||||
g = [[] for _ in range(n + 1)]
|
||||
idx = n + 1
|
||||
for _ in range(n - 1):
|
||||
u, p_node = int(data[idx]), int(data[idx + 1])
|
||||
g[u].append(p_node)
|
||||
g[p_node].append(u)
|
||||
idx += 2
|
||||
m = int(data[idx])
|
||||
idx += 1
|
||||
d = [0] * (n + 1)
|
||||
p = [0] * (n + 1)
|
||||
par = [0] * (n + 1)
|
||||
d[1] = 1
|
||||
p[1] = v[1]
|
||||
q = [1]
|
||||
for u in q:
|
||||
for nv in g[u]:
|
||||
if nv != par[u]:
|
||||
par[nv] = u
|
||||
d[nv] = d[u] + 1
|
||||
p[nv] = p[u] + v[nv]
|
||||
q.append(nv)
|
||||
up = [[0] * 18 for _ in range(n + 1)]
|
||||
for i in range(1, n + 1):
|
||||
up[i][0] = par[i]
|
||||
for k in range(1, 18):
|
||||
for i in range(1, n + 1):
|
||||
up[i][k] = up[up[i][k - 1]][k - 1]
|
||||
out = []
|
||||
for _ in range(m):
|
||||
x, y = int(data[idx]), int(data[idx + 1])
|
||||
idx += 2
|
||||
lca = f_lca(x, y)
|
||||
ans = p[x] + p[y] - p[lca] - p[up[lca][0]]
|
||||
out.append(str(ans))
|
||||
print("\n".join(out))
|
||||
0
7C.py
Normal file
0
7C.py
Normal file
0
7D.py
Normal file
0
7D.py
Normal file
0
7E.py
Normal file
0
7E.py
Normal file
0
7F.py
Normal file
0
7F.py
Normal file
0
7G.py
Normal file
0
7G.py
Normal file
0
7H.py
Normal file
0
7H.py
Normal file
0
7I.py
Normal file
0
7I.py
Normal file
32
8A.py
Normal file
32
8A.py
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
a = int(data[0])
|
||||
b = int(data[1])
|
||||
c = int(data[2])
|
||||
|
||||
x0, x1 = 1, 0
|
||||
y0, y1 = 0, 1
|
||||
temp_a, temp_b = a, b
|
||||
|
||||
while temp_b != 0:
|
||||
q = temp_a // temp_b
|
||||
temp_a, temp_b = temp_b, temp_a % temp_b
|
||||
x0, x1 = x1, x0 - q * x1
|
||||
y0, y1 = y1, y0 - q * y1
|
||||
|
||||
g = temp_a
|
||||
x = x0
|
||||
y = y0
|
||||
|
||||
if c % g != 0:
|
||||
print("Impossible")
|
||||
else:
|
||||
x *= c // g
|
||||
y *= c // g
|
||||
step = b // g
|
||||
x = x % step
|
||||
if x < 0:
|
||||
x += step
|
||||
y = (c - a * x) // b
|
||||
print(x, y)
|
||||
29
8B.py
Normal file
29
8B.py
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
import sys
|
||||
from array import array
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
p = int(data[0])
|
||||
if p == 2:
|
||||
print(1)
|
||||
sys.exit(0)
|
||||
half = p // 2 + 1
|
||||
inv = array('i', [0] * half)
|
||||
inv[1] = 1
|
||||
current_sum = 0
|
||||
count = 0
|
||||
for i in range(1, p):
|
||||
if i == 1:
|
||||
val = 1
|
||||
elif i < half:
|
||||
inv[i] = (p - (p // i) * inv[p % i]) % p
|
||||
val = inv[i]
|
||||
else:
|
||||
val = (p - (p // i) * inv[p % i]) % p
|
||||
current_sum = (current_sum + val) % p
|
||||
count += 1
|
||||
if count == 100:
|
||||
print(current_sum)
|
||||
current_sum = 0
|
||||
count = 0
|
||||
if count > 0:
|
||||
print(current_sum)
|
||||
34
8C.py
Normal file
34
8C.py
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
import sys
|
||||
|
||||
def check(n):
|
||||
if n < 2:
|
||||
return False
|
||||
if n in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37):
|
||||
return True
|
||||
if n % 2 == 0:
|
||||
return False
|
||||
d = n - 1
|
||||
r = 0
|
||||
while d % 2 == 0:
|
||||
d //= 2
|
||||
r += 1
|
||||
bases = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37)
|
||||
for a in bases:
|
||||
x = pow(a, d, n)
|
||||
if x == 1 or x == n - 1:
|
||||
continue
|
||||
for _ in range(r - 1):
|
||||
x = pow(x, 2, n)
|
||||
if x == n - 1:
|
||||
break
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
data = sys.stdin.read().split()
|
||||
num_tests = int(data[0])
|
||||
for i in range(1, num_tests + 1):
|
||||
val = int(data[i])
|
||||
if check(val):
|
||||
print("YES")
|
||||
else:
|
||||
print("NO")
|
||||
12
8D.py
Normal file
12
8D.py
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
import sys
|
||||
import math
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
x1 = int(data[0])
|
||||
y1 = int(data[1])
|
||||
x2 = int(data[2])
|
||||
y2 = int(data[3])
|
||||
dx = abs(x2 - x1)
|
||||
dy = abs(y2 - y1)
|
||||
ans = math.gcd(dx, dy) + 1
|
||||
print(ans)
|
||||
23
8E.py
Normal file
23
8E.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
n = int(data[0])
|
||||
factors = []
|
||||
d = 2
|
||||
while d * d <= n:
|
||||
if n % d == 0:
|
||||
count = 0
|
||||
while n % d == 0:
|
||||
count += 1
|
||||
n //= d
|
||||
factors.append((d, count))
|
||||
d += 1
|
||||
if n > 1:
|
||||
factors.append((n, 1))
|
||||
ans_parts = []
|
||||
for p, e in factors:
|
||||
if e > 1:
|
||||
ans_parts.append(f"{p}^{e}")
|
||||
else:
|
||||
ans_parts.append(f"{p}")
|
||||
print("*".join(ans_parts))
|
||||
1
9A.py
Normal file
1
9A.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
print(int(input())*int(input()))
|
||||
37
9B.py
Normal file
37
9B.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
import sys
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
if data:
|
||||
target_N = int(data[0])
|
||||
target_H = int(data[1])
|
||||
MOD = 786433
|
||||
if target_H > 30:
|
||||
print(0)
|
||||
sys.exit(0)
|
||||
min_n = [0] * 35
|
||||
min_n[0] = 0
|
||||
min_n[1] = 1
|
||||
for h in range(2, 35):
|
||||
min_n[h] = min_n[h-1] + min_n[h-2] + 1
|
||||
dp = [[0] * (target_N + 1) for _ in range(target_H + 2)]
|
||||
dp[0][0] = 1
|
||||
if target_N >= 1:
|
||||
dp[1][1] = 1
|
||||
for h_idx in range(2, target_H + 2):
|
||||
h_real = h_idx - 1
|
||||
if min_n[h_real + 1] > target_N:
|
||||
break
|
||||
for n in range(min_n[h_real + 1], target_N + 1):
|
||||
ways = 0
|
||||
min_k = min_n[h_idx - 2]
|
||||
max_k = n - 1 - min_n[h_idx - 2]
|
||||
if min_k > max_k:
|
||||
continue
|
||||
for k in range(min_k, max_k + 1):
|
||||
r = n - 1 - k
|
||||
w1 = dp[h_idx-1][k] * dp[h_idx-1][r]
|
||||
w2 = dp[h_idx-1][k] * dp[h_idx-2][r]
|
||||
w3 = dp[h_idx-2][k] * dp[h_idx-1][r]
|
||||
ways += w1 + w2 + w3
|
||||
dp[h_idx][n] = ways % MOD
|
||||
print(dp[target_H + 1][target_N])
|
||||
91
9C.py
Normal file
91
9C.py
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
import sys
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
if not input_data:
|
||||
sys.exit()
|
||||
|
||||
MOD = 998244353
|
||||
G = 3
|
||||
|
||||
def ntt(a, invert):
|
||||
n = len(a)
|
||||
j = 0
|
||||
for i in range(1, n):
|
||||
bit = n >> 1
|
||||
while j & bit:
|
||||
j ^= bit
|
||||
bit >>= 1
|
||||
j ^= bit
|
||||
if i < j:
|
||||
a[i], a[j] = a[j], a[i]
|
||||
step = 2
|
||||
while step <= n:
|
||||
half = step >> 1
|
||||
wlen = pow(G, (MOD - 1) // step, MOD)
|
||||
if invert:
|
||||
wlen = pow(wlen, MOD - 2, MOD)
|
||||
w = [1] * half
|
||||
curr = 1
|
||||
for i in range(half):
|
||||
w[i] = curr
|
||||
curr = (curr * wlen) % MOD
|
||||
for i in range(0, n, step):
|
||||
for j in range(half):
|
||||
u = a[i + j]
|
||||
v = (a[i + j + half] * w[j]) % MOD
|
||||
a[i + j] = (u + v) % MOD
|
||||
a[i + j + half] = (u - v + MOD) % MOD
|
||||
step <<= 1
|
||||
if invert:
|
||||
n_inv = pow(n, MOD - 2, MOD)
|
||||
for i in range(n):
|
||||
a[i] = (a[i] * n_inv) % MOD
|
||||
|
||||
def multiply(a, b):
|
||||
if not a or not b:
|
||||
return []
|
||||
sz = len(a) + len(b) - 1
|
||||
n = 1
|
||||
while n < sz:
|
||||
n <<= 1
|
||||
a = a + [0] * (n - len(a))
|
||||
b = b + [0] * (n - len(b))
|
||||
ntt(a, False)
|
||||
ntt(b, False)
|
||||
for i in range(n):
|
||||
a[i] = (a[i] * b[i]) % MOD
|
||||
ntt(a, True)
|
||||
return a[:sz]
|
||||
t = int(input_data[0])
|
||||
ptr = 1
|
||||
for _ in range(t):
|
||||
if ptr >= len(input_data):
|
||||
break
|
||||
n = int(input_data[ptr])
|
||||
s = input_data[ptr+1]
|
||||
ptr += 2
|
||||
A = [0] * n
|
||||
B = [0] * n
|
||||
for i in range(n):
|
||||
if s[i] == 'V':
|
||||
A[i] = 1
|
||||
elif s[i] == 'K':
|
||||
B[n - 1 - i] = 1
|
||||
C = multiply(A, B)
|
||||
bad = [False] * (n + 1)
|
||||
for k in range(len(C)):
|
||||
if C[k] > 0:
|
||||
dist = abs(n - 1 - k)
|
||||
if dist <= n:
|
||||
bad[dist] = True
|
||||
ans = []
|
||||
for p in range(1, n + 1):
|
||||
valid = True
|
||||
for m in range(p, n + 1, p):
|
||||
if bad[m]:
|
||||
valid = False
|
||||
break
|
||||
if valid:
|
||||
ans.append(p)
|
||||
print(len(ans))
|
||||
print(*(ans))
|
||||
41
9D.py
Normal file
41
9D.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import sys
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
s_len = int(input_data[0])
|
||||
t_len = int(input_data[1])
|
||||
k = int(input_data[2])
|
||||
S = input_data[3]
|
||||
T = input_data[4]
|
||||
|
||||
mask_S = {}
|
||||
for char in "ACGT":
|
||||
valid = [0] * s_len
|
||||
|
||||
last = -1000000
|
||||
for i in range(s_len):
|
||||
if S[i] == char:
|
||||
last = i
|
||||
if i - last <= k:
|
||||
valid[i] = 1
|
||||
|
||||
last = 1000000
|
||||
for i in range(s_len - 1, -1, -1):
|
||||
if S[i] == char:
|
||||
last = i
|
||||
if last - i <= k:
|
||||
valid[i] = 1
|
||||
|
||||
b = bytearray((s_len + 7) // 8)
|
||||
for i in range(s_len):
|
||||
if valid[i]:
|
||||
b[i // 8] |= (1 << (i % 8))
|
||||
|
||||
mask_S[char] = int.from_bytes(b, byteorder='little')
|
||||
|
||||
ans_mask = (1 << (s_len - t_len + 1)) - 1
|
||||
ans_mask &= mask_S[T[0]]
|
||||
|
||||
for j in range(1, t_len):
|
||||
ans_mask = (ans_mask << 1) & mask_S[T[j]]
|
||||
|
||||
print(ans_mask.bit_count())
|
||||
105
9E.py
Normal file
105
9E.py
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
import sys
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
|
||||
n = int(input_data[0])
|
||||
k = int(input_data[1])
|
||||
|
||||
idx = 2
|
||||
a = [int(x) for x in input_data[idx : idx + n]]
|
||||
idx += n
|
||||
|
||||
b = [int(x) for x in input_data[idx : idx + k]]
|
||||
idx += k
|
||||
|
||||
q = int(input_data[idx])
|
||||
idx += 1
|
||||
|
||||
queries = [int(x) for x in input_data[idx : idx + q]]
|
||||
|
||||
MOD = 998244353
|
||||
G = 3
|
||||
|
||||
def ntt(a, invert):
|
||||
n = len(a)
|
||||
j = 0
|
||||
for i in range(1, n):
|
||||
bit = n >> 1
|
||||
while j & bit:
|
||||
j ^= bit
|
||||
bit >>= 1
|
||||
j ^= bit
|
||||
if i < j:
|
||||
a[i], a[j] = a[j], a[i]
|
||||
step = 2
|
||||
while step <= n:
|
||||
half = step >> 1
|
||||
wlen = pow(G, (MOD - 1) // step, MOD)
|
||||
if invert:
|
||||
wlen = pow(wlen, MOD - 2, MOD)
|
||||
w = [1] * half
|
||||
curr = 1
|
||||
for i in range(half):
|
||||
w[i] = curr
|
||||
curr = (curr * wlen) % MOD
|
||||
for i in range(0, n, step):
|
||||
for j in range(half):
|
||||
u = a[i + j]
|
||||
v = (a[i + j + half] * w[j]) % MOD
|
||||
a[i + j] = (u + v) % MOD
|
||||
a[i + j + half] = (u - v + MOD) % MOD
|
||||
step <<= 1
|
||||
if invert:
|
||||
n_inv = pow(n, MOD - 2, MOD)
|
||||
for i in range(n):
|
||||
a[i] = (a[i] * n_inv) % MOD
|
||||
|
||||
def multiply(a, b):
|
||||
sz = len(a) + len(b) - 1
|
||||
n = 1
|
||||
while n < sz:
|
||||
n <<= 1
|
||||
a_pad = a + [0] * (n - len(a))
|
||||
b_pad = b + [0] * (n - len(b))
|
||||
ntt(a_pad, False)
|
||||
ntt(b_pad, False)
|
||||
for i in range(n):
|
||||
a_pad[i] = (a_pad[i] * b_pad[i]) % MOD
|
||||
ntt(a_pad, True)
|
||||
return a_pad[:sz]
|
||||
|
||||
max_a = 300005
|
||||
counts = [0] * max_a
|
||||
for x in a:
|
||||
if x < max_a:
|
||||
counts[x] += 1
|
||||
|
||||
final_ans = [0] * len(queries)
|
||||
|
||||
for H in b:
|
||||
polynoms = []
|
||||
for x in range(1, min(H, max_a)):
|
||||
if counts[x] > 0:
|
||||
polynoms.append([1, counts[x]])
|
||||
|
||||
if not polynoms:
|
||||
P = [1]
|
||||
else:
|
||||
while len(polynoms) > 1:
|
||||
next_level = []
|
||||
for i in range(0, len(polynoms), 2):
|
||||
if i + 1 < len(polynoms):
|
||||
next_level.append(multiply(polynoms[i], polynoms[i+1]))
|
||||
else:
|
||||
next_level.append(polynoms[i])
|
||||
polynoms = next_level
|
||||
P = polynoms[0]
|
||||
|
||||
for idx_q, Q in enumerate(queries):
|
||||
white_needed = Q // 2 - H - 1
|
||||
if 0 <= white_needed < len(P):
|
||||
ways = (P[white_needed] * pow(2, white_needed, MOD)) % MOD
|
||||
final_ans[idx_q] = (final_ans[idx_q] + ways) % MOD
|
||||
|
||||
for res in final_ans:
|
||||
print(res)
|
||||
22
9F.py
Normal file
22
9F.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
import sys
|
||||
|
||||
sys.set_int_max_str_digits(300000)
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
x = int(input_data[0])
|
||||
k = int(input_data[1])
|
||||
|
||||
if x == 0:
|
||||
print(0)
|
||||
elif x == 1:
|
||||
print(1)
|
||||
else:
|
||||
y = 1 << ((x.bit_length() + k - 1) // k)
|
||||
|
||||
while True:
|
||||
next_y = ((k - 1) * y + x // (y ** (k - 1))) // k
|
||||
if next_y >= y:
|
||||
break
|
||||
y = next_y
|
||||
|
||||
print(y)
|
||||
42
AA.py
Normal file
42
AA.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
import sys
|
||||
|
||||
input_data = sys.stdin.read().split()
|
||||
|
||||
n = int(input_data[0])
|
||||
m = int(input_data[1])
|
||||
|
||||
graph = [[] for _ in range(n + 1)]
|
||||
ptr = 2
|
||||
|
||||
for i in range(1, n + 1):
|
||||
while True:
|
||||
val = int(input_data[ptr])
|
||||
ptr += 1
|
||||
if val == 0:
|
||||
break
|
||||
graph[i].append(val)
|
||||
|
||||
matching = [0] * (m + 1)
|
||||
|
||||
def dfs(v):
|
||||
if used[v]:
|
||||
return False
|
||||
used[v] = True
|
||||
for to in graph[v]:
|
||||
if matching[to] == 0 or dfs(matching[to]):
|
||||
matching[to] = v
|
||||
return True
|
||||
return False
|
||||
|
||||
for i in range(1, n + 1):
|
||||
used = [False] * (n + 1)
|
||||
dfs(i)
|
||||
|
||||
result = []
|
||||
for to in range(1, m + 1):
|
||||
if matching[to] != 0:
|
||||
result.append((matching[to], to))
|
||||
|
||||
print(len(result))
|
||||
for u, v in result:
|
||||
print(u, v)
|
||||
37
AB.py
Normal file
37
AB.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
import sys
|
||||
|
||||
sys.setrecursionlimit(4000)
|
||||
|
||||
data = sys.stdin.read().split()
|
||||
|
||||
num_v = int(data[0])
|
||||
num_e = int(data[1])
|
||||
|
||||
adj = [[] for _ in range(num_v + 1)]
|
||||
cursor = 2
|
||||
|
||||
for _ in range(num_e):
|
||||
src = int(data[cursor])
|
||||
dst = int(data[cursor + 1])
|
||||
cursor += 2
|
||||
adj[src].append(dst)
|
||||
|
||||
pairs = [0] * (num_v + 1)
|
||||
|
||||
def find_match(node):
|
||||
if visited[node]:
|
||||
return False
|
||||
visited[node] = True
|
||||
for nxt in adj[node]:
|
||||
if pairs[nxt] == 0 or find_match(pairs[nxt]):
|
||||
pairs[nxt] = node
|
||||
return True
|
||||
return False
|
||||
|
||||
total_matches = 0
|
||||
for start_node in range(1, num_v + 1):
|
||||
visited = [False] * (num_v + 1)
|
||||
if find_match(start_node):
|
||||
total_matches += 1
|
||||
|
||||
print(num_v - total_matches)
|
||||
76
AC.py
Normal file
76
AC.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import sys
|
||||
|
||||
sys.setrecursionlimit(25000)
|
||||
input = sys.stdin.read().split()
|
||||
|
||||
h = int(input[0])
|
||||
w = int(input[1])
|
||||
cost_domino = int(input[2])
|
||||
cost_square = int(input[3])
|
||||
|
||||
grid = []
|
||||
idx = 4
|
||||
for _ in range(h):
|
||||
grid.append(input[idx])
|
||||
idx += 1
|
||||
|
||||
free_count = 0
|
||||
for r in range(h):
|
||||
for c in range(w):
|
||||
if grid[r][c] == '*':
|
||||
free_count += 1
|
||||
|
||||
if cost_domino >= 2 * cost_square:
|
||||
print(free_count * cost_square)
|
||||
sys.exit()
|
||||
|
||||
nodes_left = []
|
||||
nodes_right = []
|
||||
left_id = {}
|
||||
right_id = {}
|
||||
|
||||
for r in range(h):
|
||||
for c in range(w):
|
||||
if grid[r][c] == '*':
|
||||
if (r + c) % 2 == 0:
|
||||
left_id[(r, c)] = len(nodes_left) + 1
|
||||
nodes_left.append((r, c))
|
||||
else:
|
||||
right_id[(r, c)] = len(nodes_right) + 1
|
||||
nodes_right.append((r, c))
|
||||
|
||||
L = len(nodes_left)
|
||||
R = len(nodes_right)
|
||||
|
||||
adj_list = [[] for _ in range(L + 1)]
|
||||
|
||||
dr = [-1, 1, 0, 0]
|
||||
dc = [0, 0, -1, 1]
|
||||
|
||||
for r, c in nodes_left:
|
||||
u = left_id[(r, c)]
|
||||
for i in range(4):
|
||||
nr, nc = r + dr[i], c + dc[i]
|
||||
if 0 <= nr < h and 0 <= nc < w and grid[nr][nc] == '*':
|
||||
v = right_id[(nr, nc)]
|
||||
adj_list[u].append(v)
|
||||
|
||||
assigned = [0] * (R + 1)
|
||||
|
||||
def match(node):
|
||||
if seen[node]:
|
||||
return False
|
||||
seen[node] = True
|
||||
for neighbor in adj_list[node]:
|
||||
if assigned[neighbor] == 0 or match(assigned[neighbor]):
|
||||
assigned[neighbor] = node
|
||||
return True
|
||||
return False
|
||||
|
||||
pairs_found = 0
|
||||
for start in range(1, L + 1):
|
||||
seen = [False] * (L + 1)
|
||||
if match(start):
|
||||
pairs_found += 1
|
||||
ans = pairs_found * cost_domino + (free_count - 2 * pairs_found) * cost_square
|
||||
print(ans)
|
||||
0
AD.py
Normal file
0
AD.py
Normal file
0
AE.py
Normal file
0
AE.py
Normal file
0
AF.py
Normal file
0
AF.py
Normal file
0
AG.py
Normal file
0
AG.py
Normal file
Loading…
Add table
Add a link
Reference in a new issue