結果
問題 | No.274 The Wall |
ユーザー |
![]() |
提出日時 | 2017-04-04 20:20:51 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 413 ms / 2,000 ms |
コード長 | 1,796 bytes |
コンパイル時間 | 1,139 ms |
コンパイル使用メモリ | 87,540 KB |
実行使用メモリ | 132,608 KB |
最終ジャッジ日時 | 2024-06-22 02:13:23 |
合計ジャッジ時間 | 2,886 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 |
ソースコード
#include <iostream>#include <algorithm>#include <vector>using namespace std;struct scc{int n;vector<vector<int>> edge, rev, parse;vector<int> vs, cmp;vector<bool> used;scc(int n_){n = n_;edge.assign(n, vector<int>());rev.assign(n, vector<int>());cmp.assign(n, 0);used.assign(n, false);}void addedge(int from, int to){edge[from].emplace_back(to);rev[to].emplace_back(from);}void dfs(int v){used[v] = true;for(auto&& e:edge[v]) if(!used[e]) dfs(e);vs.emplace_back(v);}void rdfs(int v, int k){used[v] = true;cmp[v] = k;for(auto&& e:rev[v]) if(!used[e]) rdfs(e, k);parse[k].emplace_back(v);}int calc(){for(int i = 0; i < n; i++) if(!used[i]) dfs(i);fill(used.begin(), used.end(), false);int k = 0;for(int i = vs.size() - 1; i >= 0; i--){int v = vs[i];if(!used[v]){parse.emplace_back(vector<int>());rdfs(v, k++);}}return k;}bool same(int a, int b){return cmp[a] == cmp[b];}};int rev(int p, int m){return m - p - 1;}int main(){scc s(6000);int n, m;cin >> n >> m;int l[n], r[n];for(int i = 0; i < n; i++) cin >> l[i] >> r[i];for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++){if(l[i] <= r[j] && l[j] <= r[i]){s.addedge(j, 3000 + i);s.addedge(i, 3000 + j);}if(rev(r[i], m) <= r[j] && l[j] <= rev(l[i], m)){s.addedge(j, i);s.addedge(3000 + i, 3000 + j);}if(l[i] <= rev(l[j], m) && rev(r[j], m) <= r[i]){s.addedge(3000 + j, 3000 + i);s.addedge(i, j);}if(rev(r[i], m) <= rev(l[j], m) && rev(r[j], m) <= rev(l[i], m)){s.addedge(3000 + i, j);s.addedge(3000 + j, i);}}s.calc();for(int i = 0; i < n; i++) if(s.same(i, 3000 + i)){cout << "NO" << endl;return 0;}cout << "YES" << endl;}