#include <bits/stdc++.h>
#define int long long
using namespace std;
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
const int MOD=1e9+7;
void solve() {
int n;cin>>n;
vector<vector<int>> adj(n);
vector<int> evs(2*n);
vector<pair<int,int>> vec(n);
L(i,0,n-1){
cin>>vec[i].first>>vec[i].second;
vec[i].first--;vec[i].second--;
evs[vec[i].first]=evs[vec[i].second]=i;
}
set<pair<int,int>> ativo;
L(i,0,2*n-1){
int id=evs[i];
if(vec[id].first==i){//entrou
auto pt=ativo.lower_bound({vec[id].first+1,0});
if(pt!=ativo.end()){
auto[x,v]=*pt;
if(x<vec[id].second){
adj[v].push_back(id);
adj[id].push_back(v);
}
}
ativo.insert({vec[id].second,id});
}else{
ativo.erase({i,id});
}
}
vector<int> cor(n,-1);
auto dfs=[&](auto&& self, int node)->void{
for(auto a:adj[node]){
if(cor[a]!=-1)continue;
cor[a]=cor[node]^1;
self(self,a);
}
};
int resp=1;
L(i,0,n-1){
if(cor[i]==-1){
cor[i]=0;
resp*=2;
resp%=MOD;
dfs(dfs,i);
}
}
stack<int> st[2];
L(i,0,2*n-1){
int id=evs[i];
if(vec[id].first==i){//entra
st[cor[id]].push(id);
}else{
if(st[cor[id]].top()!=id){
cout<<0;return;
}
st[cor[id]].pop();
}
}
cout<<resp;
}
int32_t main() {
std::cin.tie(0)->sync_with_stdio(0);
std::cin.exceptions(std::cin.failbit);
int T = 1;
// std::cin >> T;
while(T--) {
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... |