Submission #857423

#TimeUsernameProblemLanguageResultExecution timeMemory
857423abcvuitunggioHoliday (IOI14_holiday)C++17
0 / 100
5056 ms3888 KiB
#include"holiday.h"
#include <bits/stdc++.h>
using namespace std;
int ch[100001],n,s,d,a[100001];
long long calc(int k){
    for (int i=0;i<n;i++)
        ch[i]=0;
    int r=min(d+s-k,n-1),l=max((s+r-d+k+1)/2,0),cnt=0,dist=s+r-l*2;
    long long val=0,mx=0;
    priority_queue <pair <int, int>> q;
    for (int i=l;i<=r;i++)
        q.push({a[i],i});
    while (!q.empty()&&cnt<k){
        ch[q.top().second]=1;
        val+=q.top().first;
        q.pop();
        cnt++;
    }
    mx=val;
    for (int i=l-1;i>=0;i--){
        dist+=2;
        while (dist+k>d){
            cnt-=ch[r];
            val-=ch[r]*a[r];
            r--;
            dist--;
        }
        if (r-l+1<k)
            break;
        q.push({a[i],i});
        while (!q.empty()&&cnt<k){
            ch[q.top().second]=1;
            val+=q.top().first;
            q.pop();
            cnt++;
        }
        mx=max(mx,val);
    }
    return mx;
}
long long solve(){
    int pos=0;
    long long mx=0,kq=0;
    for (int i=0;i<n;i+=300){
        long long val=calc(i);
        if (val>mx){
            mx=val;
            pos=i;
        }
    }
    for (int i=max(pos-300,0);i<min(pos+300,n);i++)
        kq=max(kq,calc(i));
    return kq;
}
long long findMaxAttraction(int N, int start, int D, int attraction[]){
    n=N;
    s=start;
    d=D;
    for (int i=0;i<n;i++)
        a[i]=attraction[i];
    long long res=solve();
    reverse(a,a+n);
    s=n-s-1;
    return max(res,solve());
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...