// #pragma GCC optimize("Ofast")
// #pragma GCC target("popcnt")
#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define double long double
#define mkp make_pair
#define txt freopen("shortcut.in", "r", stdin), freopen("shortcut.out", "w", stdout);
const int N = 1e6 + 10, K = 29, inf = 1e16, mod = 1e9 + 7;
const double eps = 1e-6;
struct seg
{
vector<int> t;
int n;
bool fl = 0; // 1 = max, 0 = min
seg(int n_, int f)
{
n = n_;
fl = f;
t.resize(n * 4, (fl ? 0 : 1e9));
}
int comb(int x, int y)
{
return (fl ? max(x, y) : min(x, y));
}
void upd(int x, int l, int r, int ind, int val)
{
if(l == r)
{
t[x] = val;
return;
}
int m = (l + r) / 2;
if(ind <= m)
upd(x * 2, l, m, ind, val);
else
upd(x * 2 + 1, m + 1, r, ind, val);
t[x] = comb(t[x * 2], t[x * 2 + 1]);
}
int get(int x, int l, int r, int tl, int tr)
{
if(tl > tr)
return (fl ? 0 : 1e9);
if(l == tl && r == tr)
return t[x];
int m = (l + r) / 2;
return comb(get(x * 2, l, m, tl, min(m, tr)),
get(x * 2 + 1, m + 1, r, max(tl, m + 1), tr));
}
};
vector<int> gr[100];
int col[100];
bool f0 = 1;
void dfs(int x)
{
for(auto i : gr[x])
{
if(!col[i])
{
col[i] = 3 - col[x];
dfs(i);
}
else if(col[i] == col[x])
f0 = 0;
}
}
void solve()
{
int n;
cin >> n;
int A[n + 5], B[n + 5];
for(int i = 1; i <= n; i++)
cin >> A[i] >> B[i];
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
if((A[i] > A[j] && A[i] < B[j] && B[i] > B[j]) || (A[j] > A[i] && A[j] < B[i] && B[j] > B[i]))
{
gr[i].push_back(j);
gr[j].push_back(i);
}
}
}
for(int i = 1; i <= n; i++)
{
if(col[i])
continue;
col[i] = 1;
dfs(i);
}
if(!f0)
{
cout << "0\n";
return;
}
seg mn(n * 2, 0), mx(n * 2, 1);
set<pair<int, int>> siz;
for(int i = 1; i <= n; i++)
{
siz.insert({B[i] - A[i], A[i]});
mn.upd(1, 1, n * 2, A[i], B[i]);
mx.upd(1, 1, n * 2, B[i], A[i]);
}
int res = 0;
while(!siz.empty())
{
int l = siz.begin()->second, r = l + siz.begin()->first;
siz.erase(siz.begin());
int x = mn.get(1, 1, n * 2, l + 1, r);
if(x != 1e9)
{
int L = mx.get(1, 1, n * 2, x, x), R = x;
siz.erase({R - L, L});
mn.upd(1, 1, n * 2, l, R);
mn.upd(1, 1, n * 2, L, 1e9);
mx.upd(1, 1, n * 2, r, 0);
mx.upd(1, 1, n * 2, R, l);
r = R;
siz.insert({r - l, l});
}
else
{
x = mx.get(1, 1, n * 2, l, r - 1);
if(x != 0)
{
int L = x, R = mn.get(1, 1, n * 2, x, x);
siz.erase({R - L, L});
mn.upd(1, 1, n * 2, L, r);
mn.upd(1, 1, n * 2, l, 1e9);
mx.upd(1, 1, n * 2, R, 0);
mx.upd(1, 1, n * 2, r, L);
l = L;
siz.insert({r - l, l});
}
else
{
res++;
mn.upd(1, 1, n * 2, l, 1e9);
mx.upd(1, 1, n * 2, r, 0);
}
}
}
int ans = 1;
for(int it = res; it--;)
ans = ans * 2 % mod;
cout << ans << '\n';
}
signed main()
{
// txt;
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T = 1;
for(; T--; solve());
}
/*
*/
# | 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... |