結果
問題 |
No.483 マッチ並べ
|
ユーザー |
|
提出日時 | 2017-02-12 20:21:01 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,126 bytes |
コンパイル時間 | 2,189 ms |
コンパイル使用メモリ | 182,608 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-29 16:56:30 |
合計ジャッジ時間 | 3,814 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 53 |
ソースコード
#include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define mt make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)<<endl #define smax(x,y) (x)=max((x),(y)) #define smin(x,y) (x)=min((x),(y)) #define MEM(x,y) memset((x),(y),sizeof (x)) #define sz(x) (int)(x).size() #define pb push_back typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<ll> vll; class UnionFind{ int cnt; vector<int> par, rank, size; public: UnionFind(){} UnionFind(int _n):cnt(_n), par(_n), rank(_n), size(_n, 1){ for(int i=0;i<_n;++i) par[i]=i; } int find(int k){ return (k==par[k])?k:(par[k]=find(par[k])); } int operator[](int k){ return find(k); } int getSize(int k){ return size[find(k)]; } void unite(int x, int y){ x = find(x); y = find(y); if(x==y) return; --cnt; if(rank[x] < rank[y]){ par[x] = y; size[y] += size[x]; }else{ par[y] = x; size[x] += size[y]; if(rank[y] == rank[x]) ++rank[x]; } } int count(){ return cnt; } }; int main(){ ios::sync_with_stdio(false); cin.tie(0); int N; cin >> N; vi r0, c0, r1, c1; r0 = c0 = r1 = c1 = vi(N); vi X, Y; map<pii, int> p2i; vi u(N), v(N); rep(i, N) { cin >> r0[i] >> c0[i] >> r1[i] >> c1[i]; pii a = mp(r0[i], c0[i]), b = mp(r1[i], c1[i]); for(auto p : {a,b}) { if(!p2i.count(p)) { int m = sz(p2i); p2i[p] = m; } } u[i] = p2i[a], v[i] = p2i[b]; } const int M = sz(p2i); UnionFind uf(M); rep(i, N) uf.unite(u[i], v[i]); vi deg(M); rep(i, N) { deg[uf[u[i]]]++; deg[uf[v[i]]]++; } string ans = "YES"; rep(i, M) { if(deg[uf[i]] > 2*uf.getSize(i))ans = "NO"; } cout << ans << endl; }