Submission #892189

#TimeUsernameProblemLanguageResultExecution timeMemory
89218912345678Holiday (IOI14_holiday)C++17
23 / 100
492 ms15236 KiB
#include"holiday.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int nx=1e5+5, dx=250005;

int id[nx], st, N, D;
ll ans, dp[4][dx];
vector<pair<ll, int>> v;

struct segtree
{
    int f[4*nx];
    ll sm[4*nx];
    void update(int l, int r, int i, int idx, ll val)
    {
        //cout<<"inupadate "<<val<<'\n';
        if (idx<l||r<idx) return;
        if (l==r) 
        {
            if (val>=0) return f[i]=1, sm[i]=val, void();
            else return f[i]=0, sm[i]=0, void();
        }
        int md=(l+r)/2;
        update(l, md, 2*i, idx, val);
        update(md+1, r, 2*i+1, idx, val);
        f[i]=f[2*i]+f[2*i+1];
        sm[i]=sm[2*i]+sm[2*i+1];
    }
    ll query(int l, int r, int i, int cnt)
    {
        if (cnt>=f[i]) return sm[i];
        if (cnt<=0) return 0;
        int md=(l+r)/2;
        if (f[2*i]>cnt) return query(l, md, 2*i, cnt);
        return sm[2*i]+query(md+1, r, 2*i+1, cnt-f[2*i]);
    }
} s;

void solver(int st, int ml, int sl)
{
    int lst=st-1;
    queue<tuple<int, int, int, int>> q;
    q.push({0, D, st, N-1});
    while (!q.empty())
    {
        auto [l, r, optl, optr]=q.front();
        //printf("%d %d %d %d\n", l, r, optl, optr);
        q.pop();
        if (r<l) continue;
        int md=(l+r)/2;
        pair<ll, int> p={0, optl};
        //cout<<"value "<<md<<' '<<lst<<' '<<optl<<' '<<optr<<'\n';
        for (int i=optl; i<=optr; i++)
        {
            while (lst<i) ++lst, s.update(0, N-1, 1, id[lst], v[id[lst]].first); //cout<<"update "<<lst<<' '<<id[lst]<<' '<<v[id[lst]].first<<'\n';
            while (lst>i) s.update(0, N-1, 1, id[lst], -1), lst--;
            //cout<<"query "<<i<<' '<<md-1*(i-st)<<' '<<s.query(0, N-1, 1, md-1*(i-st))<<'\n';
            p=max(p, make_pair(s.query(0, N-1, 1, md-1*(i-st)), i));
        }
        dp[sl][md]=p.first;
        //cout<<md<<' '<<dp[sl][md]<<'\n';
        q.push({l, md-1, optl, p.second});
        q.push({md+1, r, p.second, optr});
    }
}

long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
    v.resize(n);
    for (int i=0; i<n; i++) v[i]={attraction[i], i};
    sort(v.begin(), v.end());
    reverse(v.begin(), v.end());
    for (int i=0; i<n; i++) id[v[i].second]=i;
    N=n; D=d; st=start;
    solver(0, 1, 0);
    return dp[0][D];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...