結果
| 問題 |
No.100 直列あみだくじ
|
| コンテスト | |
| ユーザー |
eithia
|
| 提出日時 | 2015-01-17 10:42:36 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,054 bytes |
| コンパイル時間 | 1,645 ms |
| コンパイル使用メモリ | 161,508 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-24 01:36:18 |
| 合計ジャッジ時間 | 2,595 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 45 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=int(a);i<int(b);++i)
int n, a[50];
void input()
{
cin >> n;
rep(i, n) cin >> a[i], --a[i];
}
class disjoint_set
{
vector<int> p;
public:
disjoint_set(int n) : p(n, -1) {}
int root(int i) { return p[i] >= 0 ? p[i] = root(p[i]) : i; }
int size(int i) { return -p[root(i)]; }
bool same(int i, int j) { return root(i) == root(j); }
void merge(int i, int j) {
i = root(i), j = root(j);
if (i != j) {
if (p[i] > p[j]) swap(i, j);
p[i] += p[j], p[j] = i;
}
}
};
bool solve()
{
disjoint_set uf(n);
rep(i, n) uf.merge(i, a[i]);
vector<int> odd(n+1);
rep(i, n) if (uf.root(i) == i) {
if (uf.size(i) % 2 == 0) {
odd[uf.size(i)] ^= 1;
}
}
return accumulate(begin(odd), end(odd), 0) == 0;
}
int main()
{
cin.tie(0);
ios_base::sync_with_stdio(false);
input();
cout << (solve() ? "Yes" : "No") << endl;
}
eithia