Submission #865715

#TimeUsernameProblemLanguageResultExecution timeMemory
865715jk410Jousting tournament (IOI12_tournament)C++17
100 / 100
88 ms5540 KiB
#include <iostream> #include <algorithm> using namespace std; int N; int Tree[1<<18],Tree2[1<<18]; int Ans[100001]; int init(int l,int r,int n){ if (l==r) return Tree[n]=1; int m=(l+r)>>1; return Tree[n]=init(l,m,n<<1)+init(m+1,r,n<<1|1); } void propagate(int l,int r,int n){ if (l<r&&!Tree[n]) Tree[n<<1]=Tree[n<<1|1]=0; } int query(int x,int l,int r,int n){ propagate(l,r,n); if (l==r){ if (x==1) return l; return l+1; } int m=(l+r)>>1; if (Tree[n<<1]<x) return query(x-Tree[n<<1],m+1,r,n<<1|1); return query(x,l,m,n<<1); } int update(int lx,int rx,int l,int r,int n){ propagate(l,r,n); if (r<lx||rx<l) return Tree[n]; if (lx<=l&&r<=rx) return Tree[n]=0; int m=(l+r)>>1; return Tree[n]=update(lx,rx,l,m,n<<1)+update(lx,rx,m+1,r,n<<1|1); } int update2(int x,int v,int l,int r,int n){ if (x<l||r<x) return Tree2[n]; if (l==r) return Tree2[n]=v; int m=(l+r)>>1; return Tree2[n]=max(update2(x,v,l,m,n<<1),update2(x,v,m+1,r,n<<1|1)); } int query2(int lx,int rx,int l,int r,int n){ if (r<lx||rx<l) return -1; if (lx<=l&&r<=rx) return Tree2[n]; int m=(l+r)>>1; return max(query2(lx,rx,l,m,n<<1),query2(lx,rx,m+1,r,n<<1|1)); } int GetBestPosition(int _N, int C, int R, int *K, int *S, int *E){ N=_N; init(0,N-1,1); for (int i=0; i<C; i++){ int l=query(S[i]+1,0,N-1,1); int r=query(E[i]+2,0,N-1,1)-1; S[i]=l; E[i]=r; update(l+1,r,0,N-1,1); } for (int i=0; i<N-1; i++) update2(i,K[i],0,N-2,1); for (int i=0; i<C; i++){ if (query2(S[i],E[i]-1,0,N-2,1)<R){ Ans[S[i]]++; Ans[E[i]+1]--; } } for (int i=1; i<N; i++) Ans[i]+=Ans[i-1]; return max_element(Ans,Ans+N)-Ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...