This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
using namespace std;
const int N = 1e6 + 2;
const int mod = 1e9 + 7;
struct Node {
pair<int, int> mn, mx;
Node() {
mn = {mod, -1};
mx = {-mod, -1};
}
Node(int a, int b, int c, int d) {
mn = {a, b}; mx = {c, d};
}
}st[8 * N];
Node Combine(Node a, Node b) {
Node c = Node();
c.mn = min(a.mn, b.mn);
c.mx = max(a.mx, b.mx);
return c;
}
pair<int, int> a[2 * N];
void Init(int node, int l, int r) {
if (l == r) {
st[node] = Node(a[l].first, a[l].second, a[l].first, a[l].second);
return;
}
int mid = l + r >> 1;
Init(2 * node, l, mid);
Init(2 * node + 1, mid + 1, r);
st[node] = Combine(st[2 * node], st[2 * node + 1]);
}
Node Get(int node, int l, int r, int ql, int qr) {
if (r < ql || qr < l || ql > qr) return Node();
if (ql <= l && r <= qr) return st[node];
int mid = l + r >> 1;
return Combine(Get(2 * node, l, mid, ql, qr), Get(2 * node + 1, mid + 1, r, ql, qr));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n; cin >> n;
vector<int> l(n), r(n);
for (int i = 0; i < n; i++) {
cin >> l[i] >> r[i];
l[i] -= 1; r[i] -= 1;
a[l[i]] = {r[i], i};
a[r[i]] = {l[i], i};
}
Init(1, 0, 2 * n - 1);
vector<vector<int>> g(n);
for (int i = 0; i < n; i++) {
Node h = Get(1, 0, 2 * n - 1, l[i] + 1, r[i] - 1);
if (h.mn.first < l[i]) {
g[i].push_back(h.mn.second);
g[h.mn.second].push_back(i);
}
if (r[i] < h.mx.first) {
g[i].push_back(h.mx.second);
g[h.mx.second].push_back(i);
}
}
vector<int> col(n, -1);
function<void(int, int)> Dfs = [&] (int s, int t) {
col[s] = t;
for (int u : g[s]) {
if (col[u] == -1) Dfs(u, 1 - t);
else if (col[u] == col[s]) {
cout << 0 << en;
exit(0);
}
}
};
int ans = 1;
for (int i = 0; i < n; i++) {
if (col[i] == -1) {
Dfs(i, 0);
ans *= 2;
if (ans >= mod) ans -= mod;
}
}
cout << ans << en;
return 0;
}
Compilation message (stderr)
port_facility.cpp: In function 'void Init(int, int, int)':
port_facility.cpp:33:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
33 | int mid = l + r >> 1;
| ~~^~~
port_facility.cpp: In function 'Node Get(int, int, int, int, int)':
port_facility.cpp:41:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
41 | int mid = l + r >> 1;
| ~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |