Submission #1359409

#TimeUsernameProblemLanguageResultExecution timeMemory
1359409tung04885Feast (NOI19_feast)C++20
41 / 100
14 ms3956 KiB
#include <bits/stdc++.h>
using namespace std;
#define MAX 100100
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define __buitin_popcount __builtin_popcountll
#define BIT(x,i) (((x)>>(i))&1ll)
#define MASK(i) (1ll<<(i))

template<class X,class Y> bool maximize(X &x,Y y)
{
    if(x<y)
    {
        x=y;
        return 1;
    }
    return 0;
}

template<class X,class Y> bool minimize(X &x,Y y)
{
    if(y<x)
    {
        x=y;
        return 1;
    }
    return 0;
}

const int inf=1e9+412009;
const ll INF=2e18+412009;

pll operator + (pll a,pll b)
{
    return {a.fi+b.fi,a.se+b.se};
}

bool operator < (pll a,pll b)
{
    return a.fi==b.fi ? a.se>b.se : a.fi<b.fi;
}

int n,K;
int a[MAX];

void nhap()
{
    cin>>n>>K;
    for(int i=1;i<=n;i++) cin>>a[i];
}

pll dp[MAX][2];

pll getdp(ll tax)
{
    memset(dp,0,sizeof(dp));

    pll res={0,0};

    dp[0][1]={-tax,1};

    for(int i=1;i<=n;i++)
    {
        dp[i][0]=dp[i-1][0];
        dp[i][1]=dp[i-1][0]+make_pair(a[i]-tax,1);

        maximize(dp[i][0],dp[i-1][1]);
        maximize(dp[i][1],dp[i-1][1]+make_pair(a[i],0));

        maximize(res,max(dp[i][1],dp[i][0]));
    }

    return res;
}

void solve()
{
    ll l=1,r=INF;
    ll taxed=INF;

    while(l<=r)
    {
        ll mid=l+r>>1;

        pll tmp=getdp(mid);

        if(tmp.se>K) l=mid+1;
        else
        {
            taxed=mid;
            r=mid-1;
        }
    }

    pll res=getdp(taxed);

    cout<<res.fi+res.se*taxed;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);

    nhap();
    solve();

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...