結果
| 問題 | No.1779 Magical Swap |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-22 00:02:39 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 298 ms / 2,000 ms |
| コード長 | 2,138 bytes |
| 記録 | |
| コンパイル時間 | 307 ms |
| コンパイル使用メモリ | 82,248 KB |
| 実行使用メモリ | 108,500 KB |
| 最終ジャッジ日時 | 2026-01-22 00:02:43 |
| 合計ジャッジ時間 | 4,069 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
## https://yukicoder.me/problems/no/1779
def is_same(a_array, b_array):
for i in range(len(a_array)):
if a_array[i] != b_array[i]:
return False
return True
class UnionFind:
"""
UnionFindの基本的な処理を実装したクラス
"""
def __init__(self, size):
self.root = [i for i in range(size)]
self.size = [1] * size
def get_root(self, v):
if v == self.root[v]:
return v
else:
old_root = self.root[v]
new_root = self.get_root(old_root)
self.root[v] = new_root
return new_root
def merge(self, u, v):
root_u = self.get_root(u)
root_v = self.get_root(v)
if root_u == root_v:
return False
if self.size[root_u] >= self.size[root_v]:
self.size[root_u] += self.size[root_v]
self.root[root_v] = root_u
self.root[v] = root_u
else:
self.size[root_v] += self.size[root_u]
self.root[root_u] = root_v
self.root[u] = root_v
return True
def solve(N, A, B):
uf = UnionFind(N)
for k in range(2, N + 1):
x = k
y = 2 * k
while y <= N:
uf.merge(x - 1, y - 1)
x += k
y += k
components = {}
for i in range(N):
a = uf.get_root(i)
if a not in components:
components[a] = []
components[a].append(i)
for indexes in components.values():
a_array = []
b_array = []
for i in indexes:
a_array.append(A[i])
b_array.append(B[i])
a_array.sort()
b_array.sort()
if not is_same(a_array, b_array):
return "No"
return "Yes"
def main():
T = int(input())
answers = []
for _ in range(T):
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
answers.append(solve(N, A, B))
for ans in answers:
print(ans)
if __name__ == "__main__":
main()