Submission #1177285

#TimeUsernameProblemLanguageResultExecution timeMemory
1177285AlgorithmWarriorJousting tournament (IOI12_tournament)C++20
100 / 100
34 ms2376 KiB
#include <bits/stdc++.h> using namespace std; const int MAX=1e5+5; const int LOG=20; int ub(int x){ return x&(-x); } struct AIB{ int n; int v[MAX]; void add(int pos,int val){ while(pos<=n){ v[pos]+=val; pos+=ub(pos); } } int sum(int pos){ int s=0; while(pos){ s+=v[pos]; pos-=ub(pos); } return s; } int bin_search(int sum){ int poz=0,s=0; int i; for(i=LOG-1;i>=0;--i) if(poz+(1<<i)<=n && s+v[poz+(1<<i)]<sum){ poz+=(1<<i); s+=v[poz]; } return poz+1; } }aibSet,aibSum; int GetBestPosition(int N, int C, int R, int *K, int *S, int *E){ aibSet.n=N; aibSum.n=N; int i,j; for(i=1;i<=N;++i) aibSet.add(i,1); vector<int>ult(N-1); if(K[0]<R) ult[0]=0; else ult[0]=1; for(i=1;i<N-1;++i) if(K[i]<R) ult[i]=ult[i-1]; else ult[i]=i+1; for(i=0;i<C;++i){ ++S[i]; ++E[i]; for(j=S[i]+1;j<=E[i];++j){ int pos=aibSet.bin_search(S[i]+1); aibSet.add(pos,-1); } int pos1=aibSet.bin_search(S[i]); int pos2=aibSet.bin_search(S[i]+1); if(ult[pos2-3]<=pos1-1){ aibSum.add(pos1,1); aibSum.add(pos2,-1); } } int poz=0,best=-1; for(i=0;i<N;++i){ int val=aibSum.sum(i+1); if(val>best){ poz=i; best=val; } } return poz; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...