#include "bits/stdc++.h"
using namespace std;
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
const int maxn = 2e6 + 6;
const int mod = 1e9 + 7;
int n, l[maxn], r[maxn];
int id[maxn], c[maxn];
struct segment_tree {
int tree[maxn << 2];
segment_tree() {
memset(tree, -0x3f, sizeof(tree));
}
void update(int pos, int val, int ind, int l, int r) {
if (l == r) {
tree[ind] = val;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) {
update(pos, val, ind << 1, l, mid);
} else {
update(pos, val, ind << 1 | 1, mid + 1, r);
}
tree[ind] = max(tree[ind << 1], tree[ind << 1 | 1]);
}
int get(int x, int y, int ind, int l, int r) {
if (x > y || l > y || r < x) return -1e9;
if (x <= l and r <= y) {
return tree[ind];
}
int mid = (l + r) >> 1;
return max(get(x, y, ind << 1, l, mid), get(x, y, ind << 1 | 1, mid + 1, r));
}
} sf, sb;
void dfs(int u, int col) {
c[u] = col + 1;
while (true) {
int x = sf.get(l[u] + 1, r[u] - 1, 1, 1, n * 2);
if (x <= r[u]) break;
x = id[x];
sf.update(l[x], -1e9, 1, 1, n * 2);
sb.update(r[x], -1e9, 1, 1, n * 2);
dfs(x, col ^ 1);
}
while (true) {
int x = sb.get(l[u] + 1, r[u] - 1, 1, 1, n * 2);
if (-x >= l[u]) break;
x = id[-x];
sf.update(l[x], -1e9, 1, 1, n * 2);
sb.update(r[x], -1e9, 1, 1, n * 2);
dfs(x, col ^ 1);
}
}
void solve() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> l[i] >> r[i];
id[l[i]] = id[r[i]] = i;
sf.update(l[i], r[i], 1, 1, n * 2);
sb.update(r[i], -l[i], 1, 1, n * 2);
}
int ans = 1;
for (int i = 1; i <= n; ++i) {
if (c[i]) continue;
ans = ans + ans;
if (ans >= mod) ans -= mod;
dfs(i, 0);
}
vector<pair<int, int>> interval;
for (int ite = 1; ite <= 2; ++ite) {
interval.clear();
for (int i = 1; i <= n; ++i) {
if (c[i] == ite) {
interval.emplace_back(l[i], i);
interval.emplace_back(r[i], -i);
}
}
sort(interval.begin(), interval.end());
stack<int> st;
for (auto i:interval) {
if (i.second > 0) {
st.push(i.second);
} else {
if (st.empty() || st.top() != -i.second) {
cout << 0;
return;
}
st.pop();
}
}
}
cout << ans;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
}
# | 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... |