Submission #529897

#TimeUsernameProblemLanguageResultExecution timeMemory
529897Deepesson휴가 (IOI14_holiday)C++17
24 / 100
5068 ms3628 KiB
#include <bits/stdc++.h>
#include"holiday.h"
#define MAXS 2100000
#define MAX 110000
using ll = long long;
struct node {
    int left;
    int right;
    ll sum;
    int total;
};
node memoria[MAXS];
int cur=1;
int alocar(void){
    return cur++;
}
node nodes[MAX];
ll vals[MAX];
void inserir(node* x,ll val,int p,int la=0,int ra=MAX-1){
    if(la==ra){
        assert(p==la);
        x->total++;
        x->sum+=val;
        return;
    }
    int m = (la+ra)/2;
    if(m>=p){
        if(!x->left)x->left=alocar();
        inserir(&memoria[x->left],val,p,la,m);
    }else {
        if(!x->right)x->right=alocar();
        inserir(&memoria[x->right],val,p,m+1,ra);
    }
    ll tot = 0,ss=0;
    if(x->left)tot+=memoria[x->left].sum;
    if(x->right)tot+=memoria[x->right].sum;
    if(x->left)ss+=memoria[x->left].total;
    if(x->right)ss+=memoria[x->right].total;
    x->sum=tot;
    x->total=ss;
}
long long ans=0,limites;
/*void walk(node* k,int pode,int la=0,int ra=MAX-1){
    if(k->total<=pode){
        ans+=k->sum;
        limites=std::min(limites,la);
        return;
    }
    int m=(la+ra)/2;
    int tem = 0;
    if(k->right){
        tem=memoria[k->right].total;
    }
    int sobra = pode-tem;
    if(sobra>=0&&k->left){
        walk(&memoria[k->left],sobra,la,m);
        if(k->right)
        ans+=memoria[k->right].sum;
    }else {
        assert(&memoria[k->right]);
        walk(&memoria[k->right,sobra,m+1,ra);
    }
}*/
long long consulta(int l,int r,int p){///Naive
    std::priority_queue<int> queue;
    for(int i=l;i!=r+1;++i){
        queue.push(vals[i]);
    }
    ll ans=0;
    while(queue.size()&&p){
        --p;
        ans+=queue.top();
        queue.pop();
    }
    return ans;
}
long long pode=0;
long long resp=0;
long long inicio=0;
void dp(int l,int r,int la,int ra){
    if(r<l)return;
    int m = (l+r)/2;
    ll ans = 0,split=inicio;
    for(int i=la;i<=ra;++i){
        ll dist1=(inicio-i),dist2=(m-inicio);
        ll custo = (std::min(dist1,dist2)*2)+std::max(dist1,dist2);
        ll tem = pode-custo;
        if(tem<=0)continue;
        ll bonus = consulta(i,m,tem);
     ///   std::cout<<i<<" "<<m<<" "<<tem<< " "<<bonus<< "\n";
        if(bonus>ans){
            ans=bonus;
            split=i;
        }
    }
    resp=std::max(resp,ans);
  ///  std::cout<<ans<<" "<<m<<"<-\n";
    dp(l,m-1,la,split);
    dp(m+1,r,split,ra);
}
long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
    for(int i=0;i!=n;++i){
        vals[i]=attraction[i];
    }
    inicio=start;
    pode=d;
    dp(inicio,n-1,0,inicio);
    return resp;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...