結果
| 問題 |
No.483 マッチ並べ
|
| コンテスト | |
| ユーザー |
cormoran
|
| 提出日時 | 2017-04-19 01:19:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,903 bytes |
| コンパイル時間 | 1,812 ms |
| コンパイル使用メモリ | 184,400 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-19 07:50:59 |
| 合計ジャッジ時間 | 3,121 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
#define rep(i, j) for(int i=0; i < (int)(j); i++)
struct UnionFind{
int n;
vector<int> p;
UnionFind(int nn) {
n = nn + 1; // 1-based safe
p.resize(n);
rep(i, n) p[i] = i;
}
int root(int x) {
return p[x] == x ? x : (p[x] = root(p[x]));
}
void unite(int x,int y) {
x = root(x); y = root(y);
if(x != y) p[y] = x;
}
bool query(int x,int y){
return root(x) == root(y);
}
};
class Solver {
public:
bool solve() {
int N; cin >> N;
vector<vector<int>> E;
{
map<pii, int> mp;
int cnt = 0;
auto input = [&]() {
pii p; cin >> p.first >> p.second;
p.first--; p.second--;
if(not mp.count(p)) mp[p] = cnt++;
return mp[p];
};
rep(i, N) {
int s = input(), e = input();
E.resize(cnt);
E[s].push_back(e);
E[e].push_back(s);
}
}
UnionFind uf(E.size());
rep(i, E.size()) for(int j : E[i]) uf.unite(i, j);
vector<bool> visited(E.size());
bool ok = true;
rep(i, E.size()) {
if(visited[i]) continue;
int v = 1, e = E[i].size();
visited[i] = true;
rep(j, E.size()) if(uf.query(i, j) and not visited[j]) {
visited[j] = true;
v++;
e += E[j].size();
}
e /= 2;
ok &= v - e >= 0;
// cerr << v << " " << e << " " << v - e << endl;
}
cout << (ok ? "YES" : "NO") << endl;
return 0;
}
};
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
Solver s;
s.solve();
return 0;
}
cormoran