#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, a[1001001], b[1001001], p[1001001], c[2002002];
priority_queue<array<int, 2>, vector<array<int, 2>>, greater<>> pq;
priority_queue<int, vector<int>, greater<>> s[1001001];
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
int merge(int x, int y) {
if((x = find(x)) == (y = find(y))) return 0;
if(s[x].size() > s[y].size()) swap(x, y);
while(!s[x].empty()) s[y].push(s[x].top()), s[x].pop();
p[x] = y;
return 1;
}
void add(int u, int i) {
while(!s[u].empty() && s[u].top() <= i) s[u].pop();
while(!pq.empty() && pq.top()[0] <= i) pq.pop();
if(s[u].empty()) return;
int x = s[u].top(); s[u].pop();
pq.push({x, u});
if(!s[u].empty()) {
pq.push({s[u].top(), u});
}
s[u].push(x);
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i] >> b[i];
for(int i=1;i<=n;i++) c[a[i]] = c[b[i]] = p[i] = i, s[i].push(b[i]);
for(int i=1;i<=n+n;i++) {
int u = c[i];
if(i == b[u]) {
add(find(u), i);
continue;
}
int P = 0;
while(!pq.empty() && pq.top()[0] < b[u]) {
auto [c, x] = pq.top(); pq.pop();
if(c == P) continue;
P = c;
if(!merge(x, u)) return cout << 0, 0;
}
add(find(u), i);
}
int ans = 1;
for(int i=1;i<=n;i++) if(i == find(i)) ans = ans * 2 % 1000000007;
cout << ans;
}
# | 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... |