Submission #1143442

#TimeUsernameProblemLanguageResultExecution timeMemory
1143442simplemind_31Holiday (IOI14_holiday)C++20
23 / 100
33 ms5448 KiB
#include"holiday.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef pair<int,int> pii;
typedef tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> intset;
typedef long long ll;
vector<ll> ATRA;
vector<vector<ll>> dp;
ll maxi=0,N;
ll solveiz(ll dia, ll posicion){
    if(dia<=0 || posicion<0 || posicion>=N){
        return 0;
    }
    if(dp[dia][posicion]!=0){
        return dp[dia][posicion];
    }
    ll op1=ATRA[posicion]+solveiz(dia-2,posicion-1);
    ll op2=solveiz(dia-1,posicion-1);
    return dp[dia][posicion]=max(op1,op2);
}
ll solvede(ll dia, ll posicion){
    if(dia<=0 || posicion<0 || posicion>=N){
        return 0;
    }
    if(dp[dia][posicion]!=0){
        return dp[dia][posicion];
    }
    ll op1=ATRA[posicion]+solvede(dia-2,posicion+1);
    ll op2=solvede(dia-1,posicion+1);
    return dp[dia][posicion]=max(op1,op2);
}
ll findMaxAttraction(int n,int start,int d,int attraction[]) {
    if(start==0){
        intset res;
        int sum=0;
        int maxi=0;
        for(int i=0;i<(int)((d+1)/2) && i<n;i++){
            res.insert(attraction[i]);
            sum+=attraction[i];
        }
        maxi=sum;
        for(int i=(d+1)/2;i<n;i++){
            sum+=attraction[i];
            res.insert(attraction[i]);
            while(res.size()>0 && res.size()>d-i){
                sum-=*res.begin();
                res.erase(res.begin());
            }
            maxi=max(maxi,sum);
        }
        return maxi;
    }else{
        N=n;
        ATRA.resize(n);
        for(ll i=0;i<n;i++){
            ATRA[i]=attraction[i];
        }
        for(ll i=0;i<n;i++){
            dp.clear();
            dp.assign(d+5,vector<ll>(n+5,0));
            maxi=max(maxi,solveiz(d-abs(start-i),i));
            dp.clear();
            dp.assign(d+5,vector<ll>(n+5,0));
            maxi=max(maxi,solvede(d-abs(start-i),i));
        }
        return maxi;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...