Submission #953789

#TimeUsernameProblemLanguageResultExecution timeMemory
953789amirhoseinfar1385Passport (JOI23_passport)C++17
46 / 100
1823 ms300976 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=200000+10; int n,q,vasps[maxn],kaf=(1<<18),vassuf[maxn],tedps[maxn],tedsuf[maxn],fasps[maxn],fassuf[maxn],vis[maxn]; pair<int,int>all[maxn]; vector<int>fps,fsuf; pair<int,int>dp[maxn]; struct cmp { bool operator() (pair<int,int> a,pair<int,int> b) const { if(a.first!=b.first){ return a.first<b.first; } if(all[a.second].second!=all[b.second].second){ return all[a.second].second>all[b.second].second; } return a<b; } }; set<pair<int,int>,cmp>stdij; struct segment{ set<int>seg[(1<<19)]; void upd(int i,int l,int r,int tl,int tr,int w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ if(w<0){ w=-w; seg[i].erase(w); return ; } seg[i].insert(w); return ; } int m=(l+r)>>1; return upd((i<<1),l,m,tl,tr,w),upd((i<<1)^1,m+1,r,tl,tr,w); } int pors(int i){ i+=kaf; while(i>0){ if((int)seg[i].size()>0){ return *seg[i].begin(); } i>>=1; } return -1; } }seg; void upddij(pair<int,int>x){ int wtf=seg.pors(x.second); while(wtf!=-1){ seg.upd(1,0,kaf-1,all[wtf].first,all[wtf].second,-wtf); all[wtf].second=max(all[wtf].second,dp[x.second].second); stdij.insert(make_pair(x.first+1,wtf)); vis[wtf]=1; wtf=seg.pors(x.second); } } void dij(){ for(int i=1;i<=n;i++){ if(all[i].first==1){ stdij.insert(make_pair(1,i)); vis[i]=1; seg.upd(1,0,kaf-1,all[i].first,all[i].second,-i); } } while((int)stdij.size()>0){ auto x=*stdij.begin(); stdij.erase(x); dp[x.second]=make_pair(x.first,all[x.second].second); upddij(x); } } void vorod(){ cin>>n; for(int i=1;i<=n;i++){ cin>>all[i].first>>all[i].second; } } void pre(){ set<pair<int,int>>st; int now=0; while(true){ int nx=now; if((int)st.size()>0){ nx=max(nx,(*st.rbegin()).first); } if(nx==now){ vasps[now]=1; st.insert(make_pair(all[now+1].second,now+1)); }else{ fps.push_back((*st.rbegin()).second); st.clear(); for(int i=now+1;i<=nx;i++){ st.insert(make_pair(all[i].second,i)); } now=nx; } if(now==n){ break; } } st.clear(); now=n+1; while(true){ int nx=now; if((int)st.size()>0){ nx=min(nx,(*st.begin()).first); } if(nx==now){ vassuf[now]=1; st.insert(make_pair(all[now-1].first,now-1)); }else{ fsuf.push_back((*st.rbegin()).second); st.clear(); for(int i=now-1;i>=nx;i--){ st.insert(make_pair(all[i].first,i)); } now=nx; } if(now==1){ break; } } for(int i=1;i<=n;i++){ seg.upd(1,0,kaf-1,all[i].first,all[i].second,i); vassuf[i]|=vassuf[i-1]; } for(int i=n;i>=1;i--){ vasps[i]|=vasps[i+1]; } for(auto x:fps){ tedps[x]++; } for(auto x:fsuf){ tedsuf[x]++; } for(int i=1;i<=n;i++){ tedsuf[i]+=tedsuf[i-1]; } for(int i=n;i>=1;i--){ tedps[i]+=tedps[i+1]; } dij(); } void khor(){ int q; cin>>q; int x; cin>>x; if(vis[x]==1&&vasps[all[x].second]==0){ cout<<dp[x].first+tedps[dp[x].second+1]+(dp[x].second!=n)<<"\n"; }else{ cout<<-1<<"\n"; } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("inp.txt","r",stdin); vorod(); pre(); khor(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...