This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define FOR(i,l,r,d) for(int i=(l);i<=(r);i+=(d))
#define szof(x) ((int)(x).size())
#define vi vector<int>
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define eb emplace_back
#define mkp make_pair
const int INF = 2147483647;
const int LNF = INF*INF;
const int MOD = 1000000007;
const int mod = 998244353;
const double eps = 1e-12;
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
const int MAX = 1000010;
int n;
int in[MAX], out[MAX];
int op[2*MAX];
bool popped[MAX];
vi edge[MAX];
list<int> qu;
int pa[MAX];
int dep[MAX];
int CC;
int findp(int v){
if(v == pa[v]) return v;
return (pa[v] = findp(pa[v]));
}
void uni(int u, int v){
int pu = findp(u);
int pv = findp(v);
if(pu == pv) return;
CC--;
if(dep[pu] > dep[pv]){
pa[pv] = pu;
}
else if(dep[pu] == dep[pv]){
pa[pv] = pu;
dep[pu]++;
}
else{
pa[pu] = pv;
}
}
int tag[MAX];
int vis[MAX];
int res = 1;
void dfs(int v){
for(int i : edge[v]){
if(vis[i] == 0){
vis[i] = 1;
tag[i] = 1 - tag[v];
dfs(i);
}
else{
if(tag[i] + tag[v] != 1){
res = 0;
}
}
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
FOR(i, 1, n, 1){
cin>>in[i]>>out[i];
op[in[i]] = i;
op[out[i]] = -i;
}
FOR(i, 1, n, 1){
pa[i] = i;
dep[i] = 0;
tag[i] = -1;
vis[i] = 0;
}
CC = n;
FOR(i, 1, 2*n, 1){
if(op[i] > 0){
qu.pb(op[i]);
}
else if(op[i] < 0){
popped[-op[i]] = 1;
auto it = prev(qu.end());
for( ; *it!= -op[i]; it = prev(it)){
if(popped[*it] == 1){
qu.erase(it);
}
else{
edge[-op[i]].pb(*it);
edge[*it].pb(-op[i]);
uni(-op[i], *it);
}
}
qu.erase(it);
}
}
FOR(i, 1, n, 1){
/*
cerr<<"edge["<<i<<"] : ";
for(int j : edge[i]){
cerr<<j<<" ";
}
cerr<<endl;
*/
}
FOR(i, 1, n, 1){
if(vis[i] == 0){
tag[i] = 0;
dfs(i);
}
}
FOR(i, 1, CC, 1){
res *= 2;
res %= MOD;
}
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... |