萌新求助 40pts
  • 板块P1484 种树
  • 楼主淸梣ling
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/11/30 16:56
  • 上次更新2024/9/11 18:37:53
查看原帖
萌新求助 40pts
239192
淸梣ling楼主2022/11/30 16:56

WQS 二分的写法,但是不知道在哪里 WA 了 qwq

#include<bits/stdc++.h>
using namespace std;

int a[500100];
long long f[500100][2],g[500100][2];
int n,k;

bool check(int x)
{
    for(int i=1; i<=n; i++)
    {
        if(f[i-1][0]>f[i-1][1])
        f[i][0]=f[i-1][0], g[i][0]=g[i-1][0];
        else
        f[i][0]=f[i-1][1], g[i][0]=g[i-1][1];

        f[i][1]=f[i-1][0]+a[i]+x; g[i][1]=g[i-1][0]+1;
    }
    return f[n][0]<f[n][1] ? g[n][1]<k : g[n][0]<k;
}
int erfen(int l, int r)
{
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(check(mid+1))
        l=mid+1;
        else
        r=mid;
    }
    return l;
}
int main()
{
    cin>>n>>k;
    for(int i=1; i<=n; i++)
    scanf("%d", &a[i]);

    long long p=check(0) ? 0 : erfen(0, 1e7);

    for(int i=1; i<=n; i++)
    {
        f[i][0]=max(f[i-1][0], f[i-1][1]);
        f[i][1]=f[i-1][0]+a[i]+p;
    }
    cout<<max(f[n][0], f[n][1])-k*p;
    return 0;
}
2022/11/30 16:56
加载中...