結果
問題 | No.274 The Wall |
ユーザー |
|
提出日時 | 2021-02-01 15:42:37 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 387 ms / 2,000 ms |
コード長 | 4,430 bytes |
コンパイル時間 | 1,637 ms |
コンパイル使用メモリ | 145,740 KB |
最終ジャッジ日時 | 2025-01-18 10:36:11 |
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <cmath>#include <queue>#include <string>#include <map>#include <set>#include <stack>#include <tuple>#include <deque>#include <array>#include <numeric>#include <bitset>#include <iomanip>#include <cassert>#include <chrono>#include <random>#include <limits>#include <iterator>#include <functional>#include <sstream>#include <fstream>#include <complex>#include <cstring>#include <unordered_map>#include <unordered_set>using namespace std;using ll = long long;constexpr int INF = 1001001001;// constexpr int mod = 1000000007;constexpr int mod = 998244353;template<class T>inline bool chmax(T& x, T y){if(x < y){x = y;return true;}return false;}template<class T>inline bool chmin(T& x, T y){if(x > y){x = y;return true;}return false;}struct StronglyConnectedComponents{using G = vector<vector<int>>;G graph;G rev;int n;int scc_sz = 0;G scc_graph;vector<int> scc_id;vector<int> vs;vector<bool> visited;StronglyConnectedComponents() = default;StronglyConnectedComponents(int V) : n(V) {graph.resize(n);rev.resize(n);scc_id.assign(n, -1);visited.assign(n, false);}StronglyConnectedComponents(G& g) : graph(g), n(g.size()) {rev.resize(n);scc_id.assign(n, -1);visited.assign(n, false);for(int u = 0; u < n; ++u){for(int v : graph[u]) rev[v].push_back(u);}}void resize(int V){n = V;graph.resize(n);rev.resize(n);scc_id.assign(n, -1);visited.assign(n, false);}void add_edge(int u, int v){graph[u].emplace_back(v);rev[v].emplace_back(u);}void dfs(int from){visited[from] = true;for(int to : graph[from]){if(!visited[to]) dfs(to);}vs.push_back(from);}void rdfs(int from, int k){scc_id[from] = k;for(int to : rev[from]){if(scc_id[to] == -1) rdfs(to, k);}}void build(){for(int v = 0; v < n; ++v){if(!visited[v]) dfs(v);}reverse(vs.begin(), vs.end());for(int v : vs){if(scc_id[v] == -1) rdfs(v, scc_sz++);}scc_graph.resize(scc_sz);for(int v = 0; v < n; ++v){scc_graph[scc_id[v]].push_back(v);}return;}int size() { return scc_sz; }vector<int> get_set(int k) { return scc_graph[k]; }int operator[](int v) { return scc_id[v]; }};struct TwoSAT {StronglyConnectedComponents scc;int n;vector<int> sat;TwoSAT(int V) : n(V) {scc.resize(n * 2);sat.resize(n);}// [false] [true]void add_edge(int i, bool f, int j, bool g){scc.add_edge(i * 2 + (f ? 0 : 1), j * 2 + (g ? 1 : 0));scc.add_edge(j * 2 + (g ? 0 : 1), i * 2 + (f ? 1 : 0));}// sat[v] = true -> v = false// sat[v] = false -> v = truebool satisfiable(){scc.build();for(int i = 0; i < n; ++i){if(scc[i * 2] == scc[i * 2 + 1]) return false;sat[i] = scc[i * 2] < scc[i * 2 + 1];}return true;}vector<int> get_sat() { return sat; }};int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int N, M;cin >> N >> M;vector<int> L(N), R(N), rL(N), rR(N);for(int i = 0; i < N; ++i){cin >> L[i] >> R[i];++R[i];rL[i] = M - R[i]; rR[i] = M - L[i];}TwoSAT ts(N);auto check = [](int l1, int r1, int l2, int r2){return r1 <= l2 || l1 >= r2;};for(int i = 0; i < N; ++i){for(int j = 0; j < i; ++j){if(!check(L[i], R[i], L[j], R[j])){ts.add_edge(i, false, j, false);}if(!check(L[i], R[i], rL[j], rR[j])){ts.add_edge(i, false, j, true);}if(!check(rL[i], rR[i], L[j], R[j])){ts.add_edge(i, true, j, false);}if(!check(rL[i], rR[i], rL[j], rR[j])){ts.add_edge(i, true, j, true);}}}cout << (ts.satisfiable() ? "YES" : "NO") << '\n';return 0;}