結果

問題 No.274 The Wall
ユーザー moyashi_senpai
提出日時 2017-03-25 21:13:50
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 415 ms / 2,000 ms
コード長 3,881 bytes
コンパイル時間 1,355 ms
コンパイル使用メモリ 125,876 KB
実行使用メモリ 258,412 KB
最終ジャッジ日時 2024-06-22 02:16:03
合計ジャッジ時間 3,957 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 22
権限があれば一括ダウンロードができます

ソースコード

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

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>
#include <numeric>
#include <algorithm>
#include <functional>
#include <array>
#include <map>
#include <queue>
#include <limits.h>
#include <set>
#include <stack>
#include <random>
#include <complex>
#include <unordered_map>
#define rep(i,s,n) for(int i = (s); (n) > i; i++)
#define REP(i,n) rep(i,0,n)
#define RANGE(x,a,b) ((a) <= (x) && (x) <= (b))
#define DUPLE(a,b,c,d) (RANGE(a,c,d) || RANGE(b,c,d) || RANGE(c,a,b) || RANGE(d,a,b))
#define INCLU(a,b,c,d) (RANGE(a,c,d) && (b,c,d))
#define PW(x) ((x)*(x))
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define MODU 1000000007
#define bitcheck(a,b) ((a >> b) & 1)
#define bitset(a,b) ( a |= (1 << b))
#define bitunset(a,b) (a &= ~(1 << b))
#define MP(a,b) make_pair((a),(b))
#define Manh(a,b) (abs((a).first-(b).first) + abs((a).second - ((b).second))
#define pritnf printf
#define scnaf scanf
#define itn int
#define PI 3.141592653589
#define izryt bool
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template<typename A, size_t N, typename T>
void Fill(A(&array)[N], const T &val) {
std::fill((T*)array, (T*)(array + N), val);
}
pii Dir[8] = { //
{ 0 ,1 },{ -1 ,0 },{ 1 ,0 },{ 0 ,-1 },
{ 1 ,1 },{ 1 ,-1 },{ -1 ,1 },{ -1 ,-1 }
};
class Graph {
public:
int vn;
int sumcost = 0;
vector<vector<pii>> g;
Graph(int n) {
vn = n;
g.resize(n);
}
virtual void con(int a, int b, int w) = 0;
int getWeight(int f, int t) {
auto itr = lower_bound(ALL(g[f]), make_pair(t, INT_MIN));
if (itr != g[f].end())
return itr->second;
return INT_MIN;
}
int Costsum() {
return sumcost;
}
};
class BiDGraph : public Graph {//
public:
BiDGraph(int n) : Graph(n) {}
void con(int a, int b, int w = 1) {
g[a].push_back({ b,w });
g[b].push_back({ a, w });
sumcost++;
}
};
class DGraph : public Graph {//
public:
DGraph(int n) : Graph(n) {}
void con(int a, int b, int w = 1) {
g[a].push_back({ b,w });
sumcost++;
}
};
void SCC(DGraph& g, vector<int>& scc) {
vector<int> orb(g.vn, -1);
scc.resize(g.vn, -1);
int cc = 0;
int k = 0;
vector<bool> used(g.vn);
stack<int> st;
function<int(int)> dfs = [&](int cur) {
int low = orb[cur] = ++k;
st.push(cur);
used[cur] = 1;
for (auto itr : g.g[cur]) {
if (orb[itr.first] == -1)
low = min(low, dfs(itr.first));
else if (used[itr.first])
low = min(low, orb[itr.first]);
}
if (low == orb[cur]) {
while (1) {
int cp = st.top(); st.pop();
used[cp] = 0;
scc[cp] = cc;
if (cp == cur)
break;
}
cc++;
}
return low;
};
REP(i, g.vn)
if (orb[i] < 0)
dfs(i);
}
bool TWO_SAT(int n, vector<pii> clause) {//-, 1-indexed
DGraph g(n * 2);
for (auto itr : clause) {
int a = (itr.first < 0 ? -itr.first+n : itr.first)-1, b = (itr.second < 0 ? -itr.second+ n : itr.second)-1;
g.con(a + (a>=n?-n:n),b);
g.con(b + (b >= n ? -n : n),a);
}
vector<int> scc;
SCC(g, scc);
REP(i, n) {
if (scc[i] == scc[i + n]) {
return 0;
}
}
return 1;
}
signed main() {
int n, m;
scanf("%d %d", &n, &m);
vector<pii> wall(n);
REP(i,n){
scanf("%d %d", &wall[i].first, &wall[i].second);
}
vector<pii> clause;
for (int i = 0; n * 2 > i; i += 2) {
clause.push_back({ -(i + 1), -(i + 2) });
clause.push_back({ (i + 1), (i + 2) });
pii ti = wall[i/2];
REP(ci, 2) {
for (int j = i + 2; n * 2 > j; j += 2) {
pii tj = wall[j/2];
REP(cj, 2) {
if (DUPLE(ti.first, ti.second, tj.first, tj.second)) {
clause.push_back({ -(i + ci + 1), -(j + cj + 1) });
}
tj = { m - wall[j/2].second - 1,m - wall[j/2].first - 1 };
}
}
ti = { m - wall[i/2].second - 1,m - wall[i/2].first - 1 };
}
}
printf("%s\n", TWO_SAT(n*2, clause) ? "YES" : "NO");
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0