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;
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define F first
#define S second
#define pb push_back
const int MN = 1e6+5, mod = 1e9+7;
int N, i, j, x, y, vs[MN], col[MN], ord[MN], ans, cur, on[MN]; vector<pii> st[6*MN], st2[6*MN];
pii arr[MN], evt[2*MN]; queue<int> go; stack<int> stk[2];
void upd(int i,int s,int e,int idx,int id){
st[i].pb({arr[id].S,id});
if(s==e) return;
if((s+e)/2<idx) upd(2*i+1,(s+e)/2+1,e,idx,id);
else upd(2*i,s,(s+e)/2,idx,id);
}
void upd2(int i,int s,int e,int ss,int se,int id){
if(s>=ss&&e<=se) st2[i].pb({arr[id].S,id});
else if((s+e)/2<ss) upd2(2*i+1,(s+e)/2+1,e,ss,se,id);
else if((s+e)/2>=se) upd2(2*i,s,(s+e)/2,ss,se,id);
else upd2(2*i,s,(s+e)/2,ss,se,id), upd2(2*i+1,(s+e)/2+1,e,ss,se,id);
}
void qu(int i,int s,int e,int ss,int se,int y){
if(s>=ss&&e<=se){
while(st[i].size()&&st[i].back().F>=y){
if(!vs[st[i].back().S]){
//printf("> %d\n",st[i].back().S);
vs[st[i].back().S]=1;
col[st[i].back().S]=!col[cur];
go.push(st[i].back().S);
}
st[i].pop_back();
}
}
else if((s+e)/2<ss) qu(2*i+1,(s+e)/2+1,e,ss,se,y);
else if((s+e)/2>=se) qu(2*i,s,(s+e)/2,ss,se,y);
else qu(2*i,s,(s+e)/2,ss,se,y), qu(2*i+1,(s+e)/2+1,e,ss,se,y);
}
void qu2(int i,int s,int e,int idx,int y){
while(st2[i].size()&&st2[i].back().F<=y){
if(!vs[st2[i].back().S]){
vs[st2[i].back().S]=1;
col[st2[i].back().S]=!col[cur];
go.push(st2[i].back().S);
}
st2[i].pop_back();
}
if(s==e) return;
else if((s+e)/2<idx) qu2(2*i+1,(s+e)/2+1,e,idx,y);
else qu2(2*i,s,(s+e)/2,idx,y);
}
int main(){
scanf("%d",&N);
for(i=1;i<=N;i++){
scanf("%d%d",&arr[i].F,&arr[i].S);
ord[i] = i;
}
sort(arr+1,arr+N+1,[](pii i,pii j){return i.F<j.F;});
sort(ord+1,ord+N+1,[](int i,int j){return arr[i].S<arr[j].S;});
for(i=1;i<=N;i++){
evt[2*i-1] = {arr[i].F, i};
evt[2*i] = {arr[i].S, i};
}
for(i=1;i<=N;i++)
upd(1,1,2*N,arr[ord[i]].F,ord[i]);
for(i=N;i>=1;i--)
upd2(1,1,2*N,arr[ord[i]].F,arr[ord[i]].S,ord[i]);
ans = 1;
for(i=1;i<=N;i++){
if(!vs[i]){
ans = 2LL*ans%mod;
vs[i] = 1; cur = i;
qu(1,1,2*N,arr[i].F,arr[i].S,arr[i].S);
qu2(1,1,2*N,arr[i].F,arr[i].S);
while(go.size()){
cur=go.front(); go.pop();
qu(1,1,2*N,arr[cur].F,arr[cur].S,arr[cur].S);
qu2(1,1,2*N,arr[cur].F,arr[cur].S);
}
}
}
sort(evt+1,evt+2*N+1,[](pii i,pii j){return i.F<j.F;});
for(i=1;i<=2*N;i++){
cur = evt[i].S;
if(on[cur]){
if(stk[col[cur]].top()!=cur){
ans = 0;
break;
}
stk[col[cur]].pop();
}
else stk[col[cur]].push(cur);
on[cur]=!on[cur];
}
printf("%d\n",ans);
return 0;
}
Compilation message (stderr)
port_facility.cpp: In function 'int main()':
port_facility.cpp:61:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&N);
~~~~~^~~~~~~~~
port_facility.cpp:63:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&arr[i].F,&arr[i].S);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |