結果
問題 | No.483 マッチ並べ |
ユーザー |
![]() |
提出日時 | 2015-12-29 12:25:22 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,613 bytes |
コンパイル時間 | 1,268 ms |
コンパイル使用メモリ | 97,400 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-29 07:55:13 |
合計ジャッジ時間 | 3,197 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 53 |
ソースコード
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>//#include<cctype>#include<climits>#include<iostream>#include<string>#include<vector>#include<map>//#include<list>#include<queue>#include<deque>#include<algorithm>//#include<numeric>#include<utility>#include<complex>//#include<memory>#include<functional>#include<cassert>#include<set>#include<stack>const int dx[] = {1, 0, -1, 0};const int dy[] = {0, 1, 0, -1};using namespace std;typedef long long ll;typedef vector<int> vi;typedef vector<ll> vll;typedef pair<int, int> pii;const int MAXN = 111;pii from[MAXN], to[MAXN];bool done[2*MAXN];void dfs(int v, const vector<vector<int> >& G, vector<int>& V) {done[v] = true;V.push_back(v);for (int u : G[v]) {if (!done[u]) dfs(u, G, V);}}int main() {cin.tie(0);ios::sync_with_stdio(false);// inputint N;cin >> N;assert(1 <= N && N <= 100);for (int i = 0; i < N; i++) {cin >> from[i].first >> from[i].second >> to[i].first >> to[i].second;assert(1 <= from[i].first && from[i].first <= 100);assert(1 <= from[i].second && from[i].second <= 100);assert(1 <= to[i].first && to[i].first <= 100);assert(1 <= to[i].second && to[i].second <= 100);assert(abs(to[i].first-from[i].first) + abs(to[i].second-from[i].second) == 1);assert(from[i].first < to[i].first || from[i].second < to[i].second);}for (int i = 0; i < N; i++) for (int j = i+1; j < N; j++) {assert(!(from[i] == from[j] && to[i] == to[j]));}// solve// まずわかりやすいグラフを作るmap<pii, int> mp;for (int i = 0; i < N; i++) {mp[from[i]] = 0;mp[to[i]] = 0;}int k = 0;for (auto& el : mp) el.second = k++;vector<vector<int> > G(k);for (int i = 0; i < N; i++) {int u = mp[from[i]], v = mp[to[i]];G[u].push_back(v);G[v].push_back(u);}assert(k < 2*MAXN);// 各連結成分に対して, 頂点数と辺の数を求めて判定for (int i = 0; i < k; i++) {if (!done[i]) {vector<int> V;dfs(i, G, V);int edge = 0;for (int v : V) {edge += G[v].size();}edge /= 2;int vertex = V.size();cerr << vertex << endl;cerr << edge << endl;if (vertex + 1 <= edge) {cout << "NO" << endl;return 0;}}}cout << "YES" << endl;return 0;}