二分求助
查看原帖
二分求助
225755
LinkZelda楼主2021/1/23 23:40
#include<cstdio>
#include<algorithm>
#include<ctype.h>
#define int long long

using namespace std;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return x*f; 
 } 
 
int n,a,b,s,v[100005],mul,ans=0x7f7f7f7f7f7f7f7f,now;

bool check(int mid)
{
	now=-0x7f7f7f7f7f7f7f7f;int dp[100005]={0};
	for(int i=1;i<=n;i++)
		v[i]+=mid;
	for(int i=1;i<=n;i++)
		dp[i]=max(dp[i-1]+v[i],v[i]);
	for(int i=1;i<=n;i++)
		now=max(now,dp[i]),v[i]-=mid;
	return now*(1ll<<mul)>=s;
}

int work()
{
	int l=0,r=1e11+5,ret=0,cnt=0; 
	while(l<=r&&cnt<=60)
	{
		++cnt;
		int mid=(l+r)>>1;
		if(check(mid))ret=mid,r=mid-1;
		else l=mid+1;
	}
	return ret;
}

signed main()
{
	n=read(),a=read(),b=read(),s=read();
	for(int i=1;i<=n;i++)
		v[i]=read();
	for(mul=0;(1<<mul)<=s;mul++)
	{
		ans=min(ans,work()*a+mul*b);
	}
	printf("%lld",ans);
	return 0;
}

为啥会WA了几个点,大部分都过了,应该是细节问题吧qwq

2021/1/23 23:40
加载中...