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...