Submission #31076

#TimeUsernameProblemLanguageResultExecution timeMemory
31076top34051Jousting tournament (IOI12_tournament)C++14
100 / 100
249 ms10688 KiB
#include<bits/stdc++.h> using namespace std; #define maxn 100005 int n; int sum[maxn], p[maxn], cnt[maxn]; int tree[maxn*4]; vector<int> temp; set<int> act; vector<pair<int,int> > a; void update(int pos,int l,int r,int x,int val) { if(l>x || r<x) return ; if(l==r) { tree[pos] += val; return ; } int mid = (l+r)/2; update(pos<<1,l,mid,x,val); update(pos<<1|1,mid+1,r,x,val); tree[pos] = tree[pos<<1] + tree[pos<<1|1]; } int findpos(int pos,int l,int r,int val) { if(l==r) return l; int mid = (l+r)/2; if(tree[pos<<1]>=val) return findpos(pos<<1,l,mid,val); return findpos(pos<<1|1,mid+1,r,val-tree[pos<<1]); } int GetBestPosition(int N, int C, int X, int *K, int *L, int *R) { int i,j,l,r; pair<int,int> ans; set<int>::iterator it; n = N; for(i=0;i<n;i++) sum[i] = sum[i-1] + ((i<n-1 && K[i]>X) ? 1 : 0); for(i=0;i<=n;i++) update(1,0,n,i,1), act.insert(i); for(i=0;i<C;i++) { l = findpos(1,0,n,L[i]+1); r = findpos(1,0,n,R[i]+2)-1; // printf("%d : [%d, %d]\n",i,l,r); temp.clear(); for(it=act.find(l);it!=act.end() && *it<=r;++it) temp.push_back(*it); for(j=0;j<temp.size();j++) update(1,0,n,temp[j],-1), act.erase(temp[j]); update(1,0,n,l,1); act.insert(l); if(sum[r-1]-sum[l-1]==0) cnt[l]++, cnt[r+1]--; } ans = {0,0}; for(i=0;i<n;i++) cnt[i] += cnt[i-1], ans = max(ans,{cnt[i],-i}); return -ans.second; }

Compilation message (stderr)

tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:41:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j=0;j<temp.size();j++) update(1,0,n,temp[j],-1), act.erase(temp[j]);
                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...