#include <bits/stdc++.h>
#define MAX 2100000
#define MOD 1000000007
using namespace std;
typedef array<int, 2> pr;
int val[MAX], num[MAX], C[MAX];
vector<int> tree[MAX * 4], adj[MAX];
void query(int n, int s, int e, int l, int r, int v) {
if (r < s || e < l)
return;
else if (l <= s && e <= r) {
for (int i : tree[n])
adj[i].push_back(v), adj[v].push_back(i);
while (tree[n].size() > 1)
tree[n].pop_back();
} else {
int m = s + e >> 1;
query(n << 1, s, m, l, r, v), query(n << 1 | 1, m + 1, e, l, r, v);
}
}
void update(int n, int s, int e, int x, int v) {
if (x < s || e < x)
return;
tree[n].push_back(v);
if (s == e)
return;
int m = s + e >> 1;
update(n << 1, s, m, x, v), update(n << 1 | 1, m + 1, e, x, v);
}
bool dfs(int node, int par) {
for (int i : adj[node]) {
if (i == par)
continue;
if (C[i] != 0 && C[i] == C[node])
return false;
else if (C[i] != 0)
continue;
C[i] = 3 - C[node];
if (!dfs(i, node))
return false;
}
return true;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int N, X, Y, ans = 1;
cin >> N;
for (int i = 1; i <= N; i++)
cin >> X >> Y, val[X] = Y, num[X] = i;
for (int i = 1; i <= (N << 1); i++) {
if (!val[i])
continue;
query(1, 1, N << 1, i, val[i], num[i]);
update(1, 1, N << 1, val[i], num[i]);
}
for (int i = 1; i <= N; i++) {
if (C[i])
continue;
C[i] = 1;
ans = ((dfs(i, 0) ? ans : 0) << 1) % MOD;
}
cout << ans << '\n';
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... |