Submission #857377

#TimeUsernameProblemLanguageResultExecution timeMemory
857377abcvuitunggioHoliday (IOI14_holiday)C++17
0 / 100
520 ms4000 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 l=1,r=n-1;
    long long kq=-1;
    while (l<=r){
        int mid=(l+r)>>1;
        int x=calc(mid),y=calc(mid+1);
        if (x<y){
            kq=y;
            l=mid+1;
        }
        else
            r=mid-1;
    }
    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...