社区讨论

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 条回复,欢迎继续交流。

正在加载回复...