#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> z[1000005];
vector <pair<int,int>> v;
set <int> s;
vector <int> v1[1000005];
int a;
struct BIT{
int bit[2000005]={0};
void update(int i,int val){
i++;
while(i<=2*a){
bit[i]+=val;
i+=i&-i;
}
}
int query(int i){
i++;
int res=0;
while (i>0){
res+=bit[i];
i-=i&-i;
}
return res;
}
};
BIT f,f1;
int res=1;
bool vis[1000005];
void dfs(int i){
// cout << i << " ";
vis[i]=true;
for (auto p:v1[i]){
dfs(p);
}
}
int mod=1e9+7;
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> a;
for (int i=1;i<=a;i++){
cin >> z[i].first >> z[i].second;
}
sort(z+1,z+1+a);
for (int i=1;i<=a;i++){
v.push_back({z[i].first,i});
v.push_back({z[i].second,-i});
}
sort(v.begin(),v.end());
for (auto [x,y]:v){
// cout << x << " " << y << "\n";
if (y>0){
int val=f.query(z[y].second);
if (val>1){
cout << 0 << "\n";
return 0;
}
if (val==1){
int par=f1.query(z[y].second);
// if (y==3){
// cout << par << "\n";
// }
v1[par].push_back(y);
}
f.update(z[y].second,1);
f1.update(z[y].second,y);
}else{
f.update(z[-y].second,-1);
f1.update(z[-y].second,y);
}
}
for (int i=1;i<=a;i++){
if (!vis[i]){
// cout << "\n";
res=res*2%mod;
dfs(i);
// cout << "\n";
}
}
cout << res << "\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... |