社区讨论
WA 80pts 求助,求调wqs凸优化dp
P1792[国家集训队] 种树参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m1etyqh7
- 此快照首次捕获于
- 2024/09/23 17:54 去年
- 此快照最后确认于
- 2025/11/04 19:50 4 个月前
不知道哪里有点小错误。
CPP#include <bits/stdc++.h>
#define int long long
#define MAXN 500010
#define INF 1000000000
#define mod 998244353
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
void add(int &x,int y){x=(x+y)%mod;}
int n,m,a[MAXN],ans,b[MAXN];
int dp[MAXN][2],cnt[MAXN][2];
pii check(int k)
{
memcpy(b,a,sizeof(b));
for(int i=1;i<=n;i++) a[i]=a[i]-k;
memset(dp,-0x3f,sizeof(dp));
memset(cnt,0,sizeof(cnt));
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
dp[i][1]=dp[i-1][0]+a[i],cnt[i][1]=cnt[i-1][0]+1;
dp[i][0]=dp[i-1][1],cnt[i][0]=cnt[i-1][1];
if(dp[i-1][0]>dp[i][0]) dp[i][0]=dp[i-1][0],cnt[i][0]=cnt[i-1][0];
}
int mx=dp[n][0],Cnt=cnt[n][0];
memset(dp,-0x3f,sizeof(dp));
memset(cnt,0,sizeof(cnt));
dp[n+1][0]=0;
for(int i=n;i>=1;i--)
{
dp[i][1]=dp[i+1][0]+a[i],cnt[i][1]=cnt[i+1][0]+1;
dp[i][0]=dp[i+1][1],cnt[i][0]=cnt[i+1][1];
if(dp[i+1][0]>dp[i][0]) dp[i][0]=dp[i+1][0],cnt[i][0]=cnt[i+1][0];
}
if(dp[1][0]>mx) mx=dp[1][0],Cnt=cnt[1][0]; // mx为截距
memcpy(a,b,sizeof(a));
return {Cnt,mx+m*k};
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
if(m>((n+1)>>1))
{
cout<<"Error!"<<endl;
return;
}
int L=-INF,R=INF,ans=-INF;
/*二分写成 while(L<=R)
{
int mid=L+R>>1;
...
if(...) L=mid+1;
else(...) R=mid-1
}
也是 WA 80pts
*/
while(L+1!=R)
{
int mid=L+R>>1;
pii t=check(mid);
int x=t.fi;
if(x==m)
{
R=mid;
ans=t.se;
break;
}
else if(x<m) R=mid;
else ans=max(ans,t.se),L=mid;
}
if(ans!=-INF) cout<<ans<<endl;
else cout<<"Error!"<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
int _T=1;//cin>>_T;
while(_T--)solve();
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...