Submission #887868

# Submission time Handle Problem Language Result Execution time Memory
887868 2023-12-15T10:53:00 Z JakobZorz Jousting tournament (IOI12_tournament) C++17
100 / 100
105 ms 6960 KB
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

const int TREE_SIZE=1<<17;

int max_tree[2*TREE_SIZE];
void set_max_tree(int i,int v){
    int node=TREE_SIZE+i;
    max_tree[node]=v;
    node/=2;
    while(node){
        max_tree[node]=max(max_tree[2*node],max_tree[2*node+1]);
        node/=2;
    }
}

int get_max(int node,int l,int r,int rl,int rr){
    if(r<=rl||rr<=l)
        return 0;
    if(l<=rl&&rr<=r)
        return max_tree[node];
    
    int mid=(rl+rr)/2;
    return max(get_max(2*node,l,r,rl,mid),get_max(2*node+1,l,r,mid,rr));
}

int get_max(int l,int r){
    return get_max(1,l,r,0,TREE_SIZE);
}

bool get_interval(int left,int right,int r){
    right--;
    int m=get_max(left,right);
    return m<r;
}

int tree[2*TREE_SIZE];
void init_tree(){
    for(int i=TREE_SIZE;i<2*TREE_SIZE;i++)
        tree[i]=1;
    for(int i=TREE_SIZE-1;i>0;i--)
        tree[i]=tree[2*i]+tree[2*i+1];
}

void set_interval(int node,int l,int r,int rl,int rr){
    if(r<=rl||rr<=l){
        return;
    }
    if(l<=rl&&rr<=r){
        tree[node]=0;
        return;
    }
    
    int mid=(rl+rr)/2;
    set_interval(2*node,l,r,rl,mid);
    set_interval(2*node+1,l,r,mid,rr);
    tree[node]=tree[2*node]+tree[2*node+1];
}

int get_index(int node,int sum,int rl,int rr){
    //cout<<node<<" "<<sum<<" "<<rl<<" "<<rr<<" "<<tree[node]<<endl;
    if(sum==0)
        return rl;
    if(rl==rr-1&&sum==1)
        return rr;
    
    if(tree[node]==0&&node<TREE_SIZE){
        tree[2*node]=0;
        tree[2*node+1]=0;
    }
    
    int mid=(rl+rr)/2;
    if(sum>tree[2*node]){
        return get_index(2*node+1,sum-tree[2*node],mid,rr);
    }else{
        return get_index(2*node,sum,rl,mid);
    }
}

int GetBestPosition(int n,int c,int r,int *K,int *L,int *R){
    for(int i=0;i<c;i++)
        R[i]++;
    vector<int>present(n,1);
    init_tree();
    for(int j=0;j<c;j++){
        int sum=0;
        int l=n,r=n;
        for(int i=0;i<n;i++){
            if(sum==L[j]&&l==n)
                l=i;
            if(sum==R[j]&&r==n)
                r=i;
            sum+=present[i];
        }
        /*L[j]=l;
        R[j]=r;
        for(int i=l;i<r-1;i++)
            present[i]=0;*/
        
        L[j]=get_index(1,L[j],0,TREE_SIZE);
        R[j]=get_index(1,R[j],0,TREE_SIZE);
        //cout<<L[j]<<" "<<l<<endl;
        //cout<<R[j]<<" "<<r<<endl;
        set_interval(1,L[j],R[j]-1,0,TREE_SIZE);
    }
    
    //cout<<"the end"<<endl;
    
    for(int i=0;i<n-1;i++)
        set_max_tree(i,K[i]);
    
    int max_res=-1;
    int i_res=0;
    
    vector<pair<int,int>>ranges1(c),ranges2(c);
    for(int i=0;i<c;i++){
        ranges1[i]={L[i],R[i]};
        ranges2[i]={R[i],L[i]};
    }
    
    sort(ranges1.begin(),ranges1.end());
    sort(ranges2.begin(),ranges2.end());
    int i1=0,i2=0;
    int res=0;
    
    for(int ins=0;ins<n;ins++){
        while(i1<c&&ranges1[i1].first==ins){
            res+=get_interval(ranges1[i1].first,ranges1[i1].second,r);
            i1++;
        }
        
        while(i2<c&&ranges2[i2].first==ins){
            res-=get_interval(ranges2[i2].second,ranges2[i2].first,r);
            i2++;
        }
        
        //cout<<res<<"\n";
        
        if(res>max_res){
            max_res=res;
            i_res=ins;
        }
    }
    
    
    
    return i_res;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 1368 KB Output is correct
2 Correct 1 ms 1624 KB Output is correct
3 Correct 2 ms 1508 KB Output is correct
4 Correct 1 ms 1368 KB Output is correct
5 Correct 1 ms 1372 KB Output is correct
6 Correct 1 ms 1372 KB Output is correct
7 Correct 1 ms 1368 KB Output is correct
8 Correct 1 ms 1372 KB Output is correct
9 Correct 1 ms 1372 KB Output is correct
10 Correct 1 ms 1372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 1372 KB Output is correct
2 Correct 5 ms 1624 KB Output is correct
3 Correct 2 ms 1372 KB Output is correct
4 Correct 5 ms 1628 KB Output is correct
5 Correct 5 ms 1660 KB Output is correct
6 Correct 4 ms 1624 KB Output is correct
7 Correct 5 ms 1628 KB Output is correct
8 Correct 5 ms 1628 KB Output is correct
9 Correct 1 ms 1372 KB Output is correct
10 Correct 6 ms 1628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 34 ms 2884 KB Output is correct
2 Correct 105 ms 6948 KB Output is correct
3 Correct 17 ms 3672 KB Output is correct
4 Correct 95 ms 6752 KB Output is correct
5 Correct 94 ms 6572 KB Output is correct
6 Correct 69 ms 5532 KB Output is correct
7 Correct 100 ms 6960 KB Output is correct
8 Correct 99 ms 6948 KB Output is correct
9 Correct 14 ms 3420 KB Output is correct
10 Correct 18 ms 4028 KB Output is correct