제출 #1207092

#제출 시각아이디문제언어결과실행 시간메모리
1207092boclobanchatThrough Another Maze Darkly (CCO21_day1problem3)C++20
0 / 25
343 ms639484 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=8e5+5; deque<int> nex[MAXN]; vector<int> ds[MAXN],vi[MAXN],vd[MAXN],vq[MAXN],st[MAXN]; int root[MAXN],fen[MAXN*2],pos[MAXN],tdfs=0; bool ck[MAXN],ft[MAXN]; long long F[MAXN],Q[MAXN],ans[MAXN]; void dfs(int i,int pre) { root[i]=pre,st[i].push_back(++tdfs),pos[tdfs]=i; for(auto v:ds[i]) if(v!=pre) { dfs(v,i); st[i].push_back(++tdfs),pos[tdfs]=i; } reverse(st[i].begin(),st[i].end()); } void dfsus(int i,int idx) { if(!ft[i]) { ft[i]=true; if(st[i].back()!=tdfs) vi[idx].push_back(st[i].back()),st[i].pop_back(); } while(!nex[i].empty()) { int v=nex[i].front(); nex[i].pop_front(); if(v==root[i]) { if(!nex[i].empty()) vd[idx].push_back(i); break; } dfsus(v,idx); if(st[i].back()!=tdfs) vi[idx].push_back(st[i].back()),st[i].pop_back(); } } int getlog(long long n) { return 63-__builtin_clzll(n); } void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; } int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; } int walk(int n,int val) { int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; for(int i=1;i<=n;i++) { int k; cin>>k; while(k--) { int res; cin>>res; nex[i].push_back(res); } nex[i].push_back(nex[i].front()),nex[i].pop_front(); deque<int> res=nex[i]; while(!res.empty()) { int v=res.front(); ds[i].push_back(v),res.pop_front(); } } dfs(1,1); dfsus(1,1); vi[0].push_back(1),vd[0].push_back(1); int idx=0; while(true) { if(vd[idx].empty()) break; for(auto v:vd[idx]) dfsus(v,idx+1); idx++,F[idx]=vi[idx].size()+F[idx-1]; } for(int i=1;i<=idx;i++) F[i]+=F[i-1]; F[++idx]=1e18; for(int i=1;i<=q;i++) { long long res; cin>>res; res++; int pos=lower_bound(F+1,F+idx+1,res)-F; vq[pos].push_back(i),Q[i]=res; } for(int i=1;i<=idx;i++) { for(auto v:vi[i]) update(v,tdfs,1); if(i<idx) { for(auto v:vq[i]) { long long k=Q[v]; ans[v]=pos[walk(tdfs,k-F[i-1])]; } } else { for(auto v:vq[i]) { long long k=Q[v]; ans[v]=pos[(k-F[i-1]+tdfs-1)%tdfs+1]; } } } for(int i=1;i<=q;i++) cout<<ans[i]<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...