Submission #886288

#TimeUsernameProblemLanguageResultExecution timeMemory
886288amirhoseinfar1385Bitaro’s Party (JOI18_bitaro)C++17
100 / 100
988 ms351408 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=100000+5,maxm=200000+5,sq=sqrt(100000+5); int n,m,q; vector<int>adj[maxn]; int fp[maxn]; deque<pair<int,int>>res[maxn]; void merge(int u,int v){ for(auto x:res[u]){ fp[x.first]=1; } for(auto x:res[v]){ fp[x.first]=1; } deque<pair<int,int>>fake; int cnt=0; int ii=res[u].size()-1,jj=res[v].size()-1; while(cnt<=sq&&!(ii<0&&jj<0)){ pair<int,int>x; if(ii<0){ x=res[v][jj]; jj--; } else if(jj<0){ x=res[u][ii]; x.second++; ii--; } else if(res[u][ii].second+1>res[v][jj].second){ x=res[u][ii]; x.second++; ii--; } else{ x=res[v][jj]; jj--; } if(fp[x.first]==0){ continue; } cnt++; fp[x.first]=0; fake.push_front(x); } res[v].swap(fake); } void pre(){ for(int i=1;i<=n;i++){ res[i].push_back(make_pair(i,0)); for(auto x:adj[i]){ merge(x,i); } } } int sqq[sq+2]; int solvel(int u,int v,int t){ int alliq[v]; for(int i=0;i<v;i++){ cin>>alliq[i]; for(int j=0;j<(int)res[u].size();j++){ if(res[u][j].first==alliq[i]){ sqq[j]=t; break; } } } int jj=res[u].size()-1; while(true){ if(jj==-1){ return -1; } if(sqq[jj]==t){ jj--; continue; } return res[u][jj].second; } } int solveh(int u,int v){ int all[v+1]; for(int i=0;i<v;i++){ cin>>all[i]; } all[v]=n+2; int j=0; vector<int>dp(n+1,-1); for(int i=1;i<=u;i++){ if(i==all[j]){ j++; } else{ dp[i]=0; } for(auto x:adj[i]){ if(dp[x]!=-1){ dp[i]=max(dp[x]+1,dp[i]); } } } return dp[u]; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=0;i<m;i++){ int u,v; cin>>u>>v; adj[v].push_back(u); } pre(); for(int i=0;i<q;i++){ int u,v; cin>>u>>v; if(v<sq){ cout<<solvel(u,v,i+1)<<"\n"; } else{ cout<<solveh(u,v)<<"\n"; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...