結果
| 問題 |
No.1779 Magical Swap
|
| コンテスト | |
| ユーザー |
tnakao0123
|
| 提出日時 | 2021-12-09 14:25:29 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,534 bytes |
| コンパイル時間 | 676 ms |
| コンパイル使用メモリ | 55,344 KB |
| 実行使用メモリ | 23,776 KB |
| 最終ジャッジ日時 | 2024-07-17 07:44:36 |
| 合計ジャッジ時間 | 2,829 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 10 WA * 8 |
ソースコード
/* -*- coding: utf-8 -*-
*
* 1779.cc: No.1779 Magical Swap - yukicoder
*/
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
/* constant */
const int MAX_N = 100000;
/* typedef */
typedef multiset<int> msi;
template <const int MAX_N>
struct UFT {
int links[MAX_N], ranks[MAX_N], sizes[MAX_N];
UFT() {}
void init(int n) {
for (int i = 0; i < n; i++) links[i] = i, ranks[i] = sizes[i] = 1;
}
int root(int i) {
int i0 = i;
while (links[i0] != i0) i0 = links[i0];
return (links[i] = i0);
}
int rank(int i) { return ranks[root(i)]; }
int size(int i) { return sizes[root(i)]; }
bool same(int i, int j) { return root(i) == root(j); }
int merge(int i0, int i1) {
int r0 = root(i0), r1 = root(i1), mr;
if (r0 == r1) return r0;
if (ranks[r0] == ranks[r1]) {
links[r1] = r0;
sizes[r0] += sizes[r1];
ranks[r0]++;
mr = r0;
}
else if (ranks[r0] > ranks[r1]) {
links[r1] = r0;
sizes[r0] += sizes[r1];
mr = r0;
}
else {
links[r0] = r1;
sizes[r1] += sizes[r0];
mr = r1;
}
return mr;
}
};
/* global variables */
int as[MAX_N + 1], bs[MAX_N + 1];
msi sas[MAX_N + 1], sbs[MAX_N + 1];
UFT<MAX_N+1> uft;
/* subroutines */
void mergemsi(msi &s0, msi &s1) {
if (s0.size() < s1.size()) swap(s0, s1);
for (auto v: s1) s0.insert(v);
s1.clear();
}
void printmsi(msi &s) {
for (auto v: s) printf("%d ", v);
}
bool eqmsi(msi &s0, msi &s1) {
//printmsi(s0), printf("<=> "), printmsi(s1), putchar('\n');
if (s0.size() != s1.size()) return false;
msi::iterator sit0 = s0.begin();
msi::iterator sit1 = s1.begin();
for (; sit0 != s0.end(); sit0++, sit1++)
if (*sit0 != *sit1) return false;
return true;
}
/* main */
int main() {
int tn;
scanf("%d", &tn);
while (tn--) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", as + i);
for (int i = 1; i <= n; i++) scanf("%d", bs + i);
for (int i = 1; i <= n; i++) {
sas[i].clear(), sas[i].insert(as[i]);
sbs[i].clear(), sbs[i].insert(bs[i]);
}
uft.init(n + 1);
for (int u = 2; u * 2 <= n; u++)
for (int v = u * 2; v <= n; v += u)
if (! uft.same(u, v)) {
int p = uft.merge(u, v), q = (p != u) ? u : v;
mergemsi(sas[p], sas[q]);
mergemsi(sbs[p], sbs[q]);
}
bool ok = true;
for (int i = 1; ok && i <= n; i++)
if (uft.root(i) == i)
ok = eqmsi(sas[i], sbs[i]);
if (ok) puts("Yes");
else puts("No");
}
return 0;
}
tnakao0123