結果

問題 No.274 The Wall
ユーザー @abcde
提出日時 2019-06-29 01:55:47
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 577 ms / 2,000 ms
コード長 3,734 bytes
コンパイル時間 2,119 ms
コンパイル使用メモリ 180,932 KB
実行使用メモリ 196,608 KB
最終ジャッジ日時 2024-06-22 02:28:00
合計ジャッジ時間 4,328 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 22
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

// , .
// https://github.com/RanRanLibrary/Library/commit/662d4e41744468ddf6a8cfac4945c42b1456fe42
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < (n); i++)
typedef vector<int> vi;
// (Strongly Connected Component).
struct SCCGraph: public vector<vi>{
// ()
vector<int> order;
// .
vector<int> vs;
// 調.
vector<bool> used;
// .
using vector::vector;
// 使.
SCCGraph(const vector<vi> &v): vector::vector(v) {}
// a -> b .
void add_edge(int a, int b){ (*this)[a].push_back(b); }
// scc()使.
void dfs(int n, int k, vector<vi> &v, vector<vi> &rv){
used[n] = true;
order[n] = k;
for(auto t: v[n]){
//
rv[t].push_back(n);
if(!used[t]) dfs(t, k, v, rv);
}
vs.push_back(n);
}
// .
int scc(){
int N = size();
used.assign(N, false);
order.resize(N);
vs.clear();
// .
vector<vi> rG(N), tmp(N);
for(int n = 0; n < N; n++) if(!used[n]) dfs(n, n, (*this), rG);
used.assign(N, false);
// .
int k = 0;
for(int i = vs.size() - 1; i >= 0; i--) if(!used[vs[i]]) dfs(vs[i], k++, rG, tmp);
return k;
}
// .
bool find(int x, int y){ return order[x] == order[y]; }
};
// scc使
vector<int> scc(const vector<vi> &v){
SCCGraph g(v);
g.scc();
return g.order;
}
// 2-SAT
struct TwoSAT{
SCCGraph graph;
int N;
// .
vector<bool> val;
TwoSAT(int n): graph((n + 1) * 2), val(n + 1) { N = n; }
// (a -> b), , (~a).
void add_edge(int a, int b){
if(a < 0) a = N - a;
if(b < 0) b = N - b;
graph.add_edge(a, b);
}
// (a V b), a, b, (0), .
void add_or(int a, int b){
add_edge(-a, b);
add_edge(-b, a);
}
// .
bool solve(){
graph.scc();
bool ret = true;
for(int i = 1; i <= N; i++){
if(graph.order[i] == graph.order[N+i]) ret = false;
val[i] = (graph.order[i] > graph.order[N+i]);
}
return ret;
}
// .
bool value(int a){
if(a < 0) return !val[-a];
return val[a];
}
};
int main(){
int N, M;
int L[2005], R[2005], rL[2005], rR[2005];
TwoSAT sat(2005);
cin >> N >> M;
for(int i = 0; i < N; i++){
cin >> L[i] >> R[i];
// 180
rR[i] = M - L[i] - 1;
rL[i] = M - R[i] - 1;
}
auto fn = [&](int Li, int Lj, int Ri, int Rj, int a, int b){
// add
if(!(Rj < Li || Ri < Lj)) sat.add_or(-a, -b);
};
for(int i = 0; i < N; i++) for(int j = 0; j < i; j++){
fn( L[i], L[j], R[i], R[j], (i + 1), (j + 1));
fn(rL[i], L[j], rR[i], R[j], -(i + 1), (j + 1));
fn( L[i], rL[j], R[i], rR[j], (i + 1), -(j + 1));
fn(rL[i], rL[j], rR[i], rR[j], -(i + 1), -(j + 1));
}
cout << (sat.solve() ? "YES" : "NO") << endl;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0