제출 #1322451

#제출 시각아이디문제언어결과실행 시간메모리
1322451vivkostovFeast (NOI19_feast)C++20
100 / 100
98 ms16840 KiB
#include<bits/stdc++.h>
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
long long int n,k,a[300005],dp1[2005][2005][3],dp[300005][3],num[300005][3];
void dumb()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            dp1[i][j][0]=max(dp1[i-1][j][0],dp1[i-1][j][1]);
            dp1[i][j][1]=max(dp1[i-1][j-1][0],dp1[i-1][j][1])+a[i];
        }
    }
}
int make_dp(long long int cost)
{
    dp[0][1]=-1e18;
    for(int i=1;i<=n;i++)
    {
        if(dp[i-1][0]>dp[i-1][1])
        {
            dp[i][0]=dp[i-1][0];
            num[i][0]=num[i-1][0];
        }
        else
        {
            dp[i][0]=dp[i-1][1];
            num[i][0]=num[i-1][1];
        }
        if(dp[i-1][1]>=dp[i-1][0]-cost)
        {
            dp[i][1]=dp[i-1][1]+a[i];
            num[i][1]=num[i-1][1];
        }
        else
        {
            dp[i][1]=dp[i-1][0]-cost+a[i];
            num[i][1]=num[i-1][0]+1;
        }
        //cout<<dp[i][0]<<" "<<dp[i][1]<<endl;
    }
    //cout<<endl;
    if(dp[n][0]==dp[n][1])return min(num[n][0],num[n][1]);
    if(dp[n][0]<dp[n][1])return num[n][1];
    return num[n][0];
}
void read()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    long long int l=1,r=1e18,mid,use,fin;
    while(l<=r)
    {
        mid=(l+r)/2;
        use=make_dp(mid);
        if(use>=k)l=mid+1;
        else r=mid-1;
    }
    l--;
    use=make_dp(l);
    //cout<<l<<" "<<use<<" "<<max(dp[n][0],dp[n][1])<<endl;
    fin=max(dp[n][0],dp[n][1])+use*l-(use-k)*l;
    cout<<fin<<endl;
}
int main()
{
    speed();
    read();

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