Submission #232697

#TimeUsernameProblemLanguageResultExecution timeMemory
232697thebesPort Facility (JOI17_port_facility)C++14
78 / 100
6102 ms782700 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...