제출 #130706

#제출 시각아이디문제언어결과실행 시간메모리
130706dragonslayerit마상시합 토너먼트 (IOI12_tournament)C++14
0 / 100
274 ms7880 KiB
#include <vector> std::vector<int> children[200005]; int N; int st[200005]; int query(int a,int b){ int res=0; for(a+=N-1,b+=N-1;a<b;a>>=1,b>>=1){ if(a&1) res=std::max(res,st[a++]); if(b&1) res=std::max(res,st[--b]); } return res; } int size[200005]; int depth[200005]; int deep[200005]; int R; void dfs1(int node){ size[node]=1; if(node<N){ deep[node]=node; } for(int child:children[node]){ dfs1(child); if(depth[child]+1>depth[node]){ depth[node]=depth[child]+1; deep[node]=deep[child]; } size[node]+=size[child]; } } std::pair<int,int> best(-1,-1); void dfs2(int node,int prefix,int suffix){ if(query(prefix,N-1-suffix)<=R){ best=std::max(best,{depth[node],-deep[node]}); } suffix+=size[node]; for(int child:children[node]){ suffix-=size[child]; dfs2(child,prefix,suffix); prefix+=size[child]; } } int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) { ::N=N; ::R=R; std::vector<int> stand; for(int i=0;i<N;i++){ stand.push_back(i); } for(int i=0;i<C;i++){ for(int j=S[i];j<=E[i];j++){ children[N+i].push_back(stand[S[i]]); stand.erase(stand.begin()+S[i]); } stand.insert(stand.begin()+S[i],N+i); } for(int i=0;i<N-1;i++){ st[N-1+i]=K[i]; } for(int i=N-2;i>0;i--){ st[i]=std::max(st[i<<1],st[i<<1|1]); } dfs1(N+C-1); dfs2(N+C-1,0,0); return -best.second; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...