結果
問題 | No.274 The Wall |
ユーザー | ferin |
提出日時 | 2019-09-20 18:25:15 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,924 bytes |
コンパイル時間 | 2,015 ms |
コンパイル使用メモリ | 182,676 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-14 10:07:51 |
合計ジャッジ時間 | 2,846 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 3 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 4 ms
6,940 KB |
testcase_12 | AC | 3 ms
6,944 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 3 ms
6,944 KB |
testcase_15 | AC | 2 ms
6,944 KB |
testcase_16 | AC | 3 ms
6,940 KB |
testcase_17 | AC | 4 ms
6,940 KB |
testcase_18 | AC | 3 ms
6,944 KB |
testcase_19 | AC | 2 ms
6,940 KB |
testcase_20 | AC | 2 ms
6,940 KB |
testcase_21 | AC | 2 ms
6,940 KB |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | AC | 3 ms
6,940 KB |
testcase_25 | AC | 3 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; // #define int ll using PII = pair<ll, ll>; #define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i) #define REP(i, n) FOR(i, 0, n) #define ALL(x) x.begin(), x.end() template<typename T> T &chmin(T &a, const T &b) { return a = min(a, b); } template<typename T> T &chmax(T &a, const T &b) { return a = max(a, b); } template<typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; } template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); } template<typename T> vector<T> make_v(size_t a) { return vector<T>(a); } template<typename T,typename... Ts> auto make_v(size_t a,Ts... ts) { return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...)); } template<typename T,typename V> typename enable_if<is_class<T>::value==0>::type fill_v(T &t, const V &v) { t=v; } template<typename T,typename V> typename enable_if<is_class<T>::value!=0>::type fill_v(T &t, const V &v ) { for(auto &e:t) fill_v(e,v); } template<class S,class T> ostream &operator <<(ostream& out,const pair<S,T>& a) { out<<'('<<a.first<<','<<a.second<<')'; return out; } template<class T> ostream &operator <<(ostream& out,const vector<T>& a){ out<<'['; for(const T &i: a) out<<i<<','; out<<']'; return out; } template<class T> ostream &operator <<(ostream& out, const set<T>& a) { out<<'{'; for(const T &i: a) out<<i<<','; out<<'}'; return out; } template<class T, class S> ostream &operator <<(ostream& out, const map<T,S>& a) { out<<'{'; for(auto &i: a) out<<i<<','; out<<'}'; return out; } int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; // DRUL const int INF = 1<<30; const ll LLINF = 1LL<<60; const ll MOD = 1000000007; struct SCC { int V, K; vector<vector<int>> G; vector<vector<int>> rG; vector<int> vs; vector<int> used; vector<int> cmp; SCC() { V=K=-1; } SCC(int V_): V(V_), G(V_), rG(V_), used(V_), cmp(V_) {} void add_edge(int from,int to) { G[from].push_back(to); rG[to].push_back(from); } void dfs(int v) { used[v]=true; for(int nx: G[v]) if(!used[nx]) dfs(nx); vs.push_back(v); } void rdfs(int v,int k) { used[v]=true; cmp[v]=k; for(int nx: rG[v]) if(!used[nx]) rdfs(nx,k); } int scc() { used.assign(V,0); vs.clear(); for(int v=0;v<V;v++) if(!used[v]) dfs(v); used.assign(V,0); int k=0; for(int i=(int)vs.size()-1;i>=0;i--) if(!used[vs[i]]) { rdfs(vs[i],k++); } return K=k; } // O(ElogE) // SCCしたあとのグラフはトポロジカル順になってる vector<vector<int>> getDAG() { vector<vector<int>> res(K); for(int from=0;from<V;from++) { for(int to:G[from]) if(cmp[from]!=cmp[to]) { res[cmp[from]].push_back(cmp[to]); } } for(int i=0;i<K;i++){ sort(ALL(res[i])); res[i].erase(unique(ALL(res[i])),res[i].end()); } return res; } }; struct twoSAT { ll n; SCC graph; vector<bool> ans; twoSAT(ll n) : n(n), graph(n*2), ans(n) {} // not なら false void add(pair<ll,bool> a0, pair<ll,bool> b0) { ll a = a0.first, ar = (a0.first+n)%(2*n); ll b = b0.first, br = (b0.first+n)%(2*n); if(!a0.second) swap(a, ar); if(!b0.second) swap(b, br); graph.add_edge(ar, b); graph.add_edge(br, a); } bool solve() { graph.scc(); REP(i, n) if(graph.cmp[i] == graph.cmp[n+i]) return false; REP(i, n) ans[i] = graph.cmp[i] > graph.cmp[n+i]; return true; } }; signed main(void) { cin.tie(0); ios::sync_with_stdio(false); ll n, m; cin >> n >> m; vector<ll> l(n), r(n); REP(i, n) cin >> l[i] >> r[i]; auto cross = [](ll l1, ll r1, ll l2, ll r2) { const bool comp1 = l1 <= l2 && l2 <= r1; const bool comp2 = l1 <= r2 && r2 <= r1; const bool comp3 = l2 <= l1 && l1 <= r2; const bool comp4 = l2 <= r1 && r1 <= r2; return comp1 || comp2 || comp3 || comp4; }; twoSAT sat(n); REP(i, n-1) { // cout << "i=" << i << endl; if(cross(l[i], r[i], l[i+1], r[i+1])) { // cout << "a" << endl; sat.add({i, false}, {i+1, false}); } if(cross(l[i], r[i], m-r[i+1]+1, m-l[i+1]+1)) { // cout << "b" << endl; sat.add({i, false}, {i+1, true}); } if(cross(m-r[i]+1, m-l[i]+1, l[i+1], r[i+1])) { // cout << "c" << endl; sat.add({i, true}, {i+1, false}); } if(cross(m-r[i]+1, m-l[i]+1, m-r[i+1]+1, m-l[i+1]+1)) { // cout << "d" << endl; sat.add({i, true}, {i+1, true}); } } if(sat.solve()) cout << "YES" << endl; else cout << "NO" << endl; return 0; }