제출 #599297

#제출 시각아이디문제언어결과실행 시간메모리
599297Bench0310마상시합 토너먼트 (IOI12_tournament)C++17
100 / 100
121 ms36612 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=100000; int tree[4*N]; void update(int idx,int l,int r,int pos,int x) { if(l==r) tree[idx]=x; else { int m=(l+r)/2; if(pos<=m) update(2*idx,l,m,pos,x); else update(2*idx+1,m+1,r,pos,x); tree[idx]=tree[2*idx]+tree[2*idx+1]; } } int descend(int idx,int l,int r,int p) { if(l==r) return l; int m=(l+r)/2; if(p<=tree[2*idx]) return descend(2*idx,l,m,p); else return descend(2*idx+1,m+1,r,p-tree[2*idx]); } int GetBestPosition(int n,int m,int R,int *K,int *S,int *E) { for(int i=1;i<=n;i++) update(1,1,n,i,1); vector<int> head(n+1,0); for(int i=1;i<=n;i++) head[i]=i; vector<int> v[n+m+1]; for(int i=1;i<=m;i++) { int l=S[i-1]+1; int r=E[i-1]+1; for(int j=l;j<=r;j++) { int p=descend(1,1,n,l); v[n+i].push_back(head[p]); if(j<r) update(1,1,n,p,0); else head[p]=n+i; } } vector<array<int,18>> p(n+m+1); for(int i=0;i<=n+m;i++) p[i].fill(0); vector<int> tin(n+m+1,0); vector<int> tout(n+m+1,0); function<void(int)> dfs=[&](int a) { for(int i=1;i<18;i++) p[a][i]=p[p[a][i-1]][i-1]; if(a<=n) tin[a]=tout[a]=a; for(int to:v[a]) { p[to][0]=a; dfs(to); if(tin[a]==0) tin[a]=tin[to]; tout[a]=tout[to]; } }; dfs(n+m); vector<int> val(n,0); for(int i=1;i<=n-1;i++) val[i]=(K[i-1]>R); vector<int> s(n+1,0); for(int i=2;i<=n;i++) s[i]=s[i-1]+val[i-1]; auto sum=[&](int l,int r)->int{return (s[r]-s[l-1]);}; array<int,2> res={-1,0}; for(int i=1;i<=n;i++) { if(i>=2) s[i-1]+=val[i-1]; int a=i; int cnt=0; for(int j=17;j>=0;j--) { if(p[a][j]!=0&&sum(tin[p[a][j]],tout[p[a][j]])==0) { a=p[a][j]; cnt+=(1<<j); } } res=max(res,{cnt,-i}); } return -res[1]-1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...