社区讨论

wqs二分 有个小疑问

P1484种树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlivyz3u
此快照首次捕获于
2026/02/12 11:15
上周
此快照最后确认于
2026/02/14 16:30
5 天前
查看原帖
写 wqs 二分90pts于是我把取答案改成 ans=x.second-k*mid就过了,求教。
90ptsCPP
#include <bits/stdc++.h>
using namespace std;
#ifdef __linux__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc _getchar_nolock
#define pc _putchar_nolock
#endif
#define int long long
#define rint register int
#define R register
#define _ read<int>()
template<class T>inline T read()
{
    R T r=0,f=1;R char c=gc();
    while(!isdigit(c))
    {
        if(c=='-') f=-1;
        c=gc();
    }
    while(isdigit(c)) r=(r<<1)+(r<<3)+(c^48),c=gc();
    return f*r;
}
inline void out(rint x)
{
    if(x<0) pc('-'),x=-x;
    if(x<10) pc(x+'0');
    else out(x/10),pc(x%10+'0');
}
const int N=3e5+10,INF=1145141919810;
int a[N],n;
pair<int,int>dp[N][2];
inline pair<int,int> check(rint x)
{
    for(rint i=0;i<=n;++i) dp[i][0]=dp[i][1]={INF,-INF};
    dp[0][0]={0,0};
    rint tmp;
    for(rint i=1;i<=n;++i)
    {
        tmp=dp[i-1][0].second+a[i]+x;
        if(dp[i][1].second<=tmp) 
        {
            dp[i][1].second=tmp;
            if(dp[i][1].second==tmp) dp[i][1].first=min(dp[i-1][0].first+1,dp[i][1].first);
            else dp[i][1].first=dp[i-1][0].first+1;
        }
        if(dp[i-1][0].second<dp[i-1][1].second) dp[i][0]=dp[i-1][1];
        else if(dp[i-1][0].second>dp[i-1][1].second) dp[i][0]=dp[i-1][0];
        else dp[i][0]=dp[i-1][1],dp[i][0].first=min(dp[i][0].first,dp[i-1][0].first);
    }   
    if(dp[n][0].second>dp[n][1].second||(dp[n][0].second==dp[n][1].second&&dp[n][1].first>dp[n][0].first)) return dp[n][0];
    else return dp[n][1];
}
signed main()
{
    n=_;rint k=_;
    for(rint i=1;i<=n;++i) a[i]=_;
    rint l=-2e11,r=2e11,mid,ans=0;
    while(l<=r)
    {
        mid=l+r>>1;
        auto x=check(mid);
        // if(x.first<=k) cout<<x.second-x.first*mid<<' '<<x.first<<endl;
        if(x.first<=k)
        {
            l=mid+1;if(x.second-x.first*mid>ans) ans=x.second-x.first*mid;
        }
        else r=mid-1;
    }
    out(ans);
    return 0;
}
100ptsCPP
#include <bits/stdc++.h>
using namespace std;
#ifdef __linux__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc _getchar_nolock
#define pc _putchar_nolock
#endif
#define int long long
#define rint register int
#define R register
#define _ read<int>()
template<class T>inline T read()
{
    R T r=0,f=1;R char c=gc();
    while(!isdigit(c))
    {
        if(c=='-') f=-1;
        c=gc();
    }
    while(isdigit(c)) r=(r<<1)+(r<<3)+(c^48),c=gc();
    return f*r;
}
inline void out(rint x)
{
    if(x<0) pc('-'),x=-x;
    if(x<10) pc(x+'0');
    else out(x/10),pc(x%10+'0');
}
const int N=3e5+10,INF=1145141919810;
int a[N],n;
pair<int,int>dp[N][2];
inline pair<int,int> check(rint x)
{
    for(rint i=0;i<=n;++i) dp[i][0]=dp[i][1]={INF,-INF};
    dp[0][0]={0,0};
    rint tmp;
    for(rint i=1;i<=n;++i)
    {
        tmp=dp[i-1][0].second+a[i]+x;
        if(dp[i][1].second<=tmp) 
        {
            dp[i][1].second=tmp;
            if(dp[i][1].second==tmp) dp[i][1].first=min(dp[i-1][0].first+1,dp[i][1].first);
            else dp[i][1].first=dp[i-1][0].first+1;
        }
        if(dp[i-1][0].second<dp[i-1][1].second) dp[i][0]=dp[i-1][1];
        else if(dp[i-1][0].second>dp[i-1][1].second) dp[i][0]=dp[i-1][0];
        else dp[i][0]=dp[i-1][1],dp[i][0].first=min(dp[i][0].first,dp[i-1][0].first);
    }   
    if(dp[n][0].second>dp[n][1].second||(dp[n][0].second==dp[n][1].second&&dp[n][1].first>dp[n][0].first)) return dp[n][0];
    else return dp[n][1];
}
signed main()
{
    n=_;rint k=_;
    for(rint i=1;i<=n;++i) a[i]=_;
    auto tmp=check(0);
    if(tmp.first<=k)
    {
        out(tmp.second);return 0;
    }
    rint l=-2e11,r=0,mid,ans=0;
    while(l<=r)
    {
        mid=l+r>>1;
        auto x=check(mid);
        // cout<<x.second-x.first*mid<<' '<<x.first<<' '<<mid<<endl;
        if(x.first<=k)
        {
            l=mid+1;ans=x.second-k*mid;
        }
        else r=mid-1;
    }
    out(ans);
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...