結果
| 問題 |
No.2523 Trick Flower
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-10 00:27:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,575 ms / 4,000 ms |
| コード長 | 3,060 bytes |
| コンパイル時間 | 638 ms |
| コンパイル使用メモリ | 82,628 KB |
| 実行使用メモリ | 148,352 KB |
| 最終ジャッジ日時 | 2025-03-10 00:27:25 |
| 合計ジャッジ時間 | 14,870 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
## https://yukicoder.me/problems/no/2523
from collections import deque
def solve(in_degree, next_nodes, node_map, cycle_index_list, A, B, value):
has_values = [0] * len(next_nodes)
for i in range(len(A)):
a = A[i]
has_values[cycle_index_list[i]] += a
need_values = [0] * len(next_nodes)
for i in range(len(B)):
b = B[i] * value
need_values[cycle_index_list[i]] += b
queue = deque()
for i in range(len(next_nodes)):
if in_degree[i] == 0:
queue.append(i)
while len(queue) > 0:
i = queue.popleft()
required_value = max(0, need_values[i] - has_values[i])
if len(next_nodes[i]) == 0 and required_value > 0:
return False
for j in next_nodes[i]:
need_values[j] += required_value
in_degree[j] -= 1
if in_degree[j] == 0:
queue.append(j)
return True
def main():
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))
# 「強連結成分」を1成分としたDAGを構築
cycle_index_list = [-2] * N
cycle_index = 0
for s_i in range(N):
if cycle_index_list[s_i] == -2:
s_map = {}
s = s_i
while s not in s_map and cycle_index_list[s] == -2:
s_map[s] = True
cycle_index_list[s] = -1
s = C[s] - 1
if s not in s_map and cycle_index_list[s] != -2:
continue
array = [s]
v = C[s] - 1
while v != s:
array.append(v)
v = C[v] - 1
for s in array:
cycle_index_list[s] = cycle_index
cycle_index += 1
node_map = {}
composition_index = cycle_index
for i in range(N):
if cycle_index_list[i] == -1:
node_map[composition_index] = [i]
cycle_index_list[i] = composition_index
composition_index += 1
else:
c = cycle_index_list[i]
if c not in node_map:
node_map[c] = []
node_map[c].append(i)
next_nodes = [[] for _ in range(composition_index)]
in_degree = [0] * composition_index
for i in range(N):
c_f = cycle_index_list[i]
c_t = cycle_index_list[C[i] - 1]
if c_f == c_t:
continue
else:
next_nodes[c_f].append(c_t)
in_degree[c_t] += 1
# 2分探索
a_total = sum(A)
b_total = sum(B)
max_n = a_total // b_total
low = 0
high = max_n
while high - low > 1:
mid = (high + low) // 2
if solve(in_degree.copy(), next_nodes, node_map, cycle_index_list, A, B, mid):
low = mid
else:
high = mid
if solve(in_degree.copy(), next_nodes, node_map, cycle_index_list, A, B, high):
print(high)
else:
print(low)
if __name__ == "__main__":
main()