Submission #854818

#TimeUsernameProblemLanguageResultExecution timeMemory
85481812345678Holiday (IOI14_holiday)C++17
23 / 100
28 ms12212 KiB
#include"holiday.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int nx=1e5+5;

int id[nx];
ll ans;

struct segtree
{
    int f[4*nx];
    ll sm[4*nx];
    void update(int l, int r, int i, int idx, ll val)
    {
        if (idx<l||r<idx) return;
        if (l==r) return f[i]=1, sm[i]=val, 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;

long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
    vector<pair<ll, int>> v(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;
    for (int i=0; i<n; i++)
    {
        s.update(0, n-1, 1, id[i], attraction[i]);
        ans=max(ans, s.query(0, n-1, 1, d-i));
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...