社区讨论

斜率优化70分求助,玄关

学术版参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lyjpwkn1
此快照首次捕获于
2024/07/13 14:00
2 年前
此快照最后确认于
2024/07/13 15:23
2 年前
查看原帖
斜率优化 70 分,求助大犇们。
CPP
#include<bits/stdc++.h>
#define LL long long
/*
*/
LL read()
{
	char ch=getchar();
	LL x=0;
	while(ch<'0'||ch>'9')
		ch=getchar();
	while(ch>='0'&&ch<='9')
		x=(x<<3)+(x<<1)+(ch&15),ch=getchar();
	return x;
}
const int N=1e5+5;
int n,D;
LL s[N],a[N],X[N];
double ans[N];
std::deque<int>q;
double get_k(int x,int y)
{
	return (double)(s[x]-s[y])/(double)(x-y)*D;
}
double calc(LL x,LL y,int p)
{
	return (double)(y-s[p])/(double)(x-D*(p+1));
}
double tri_find(LL x,LL y)
{
	int l=0,r=q.size()-1,mid1,mid2;
	double res=-1e9;
	while(l<=r)
	{
		mid1=l+(r-l+1)/3,mid2=l+(r-l+1)*2/3;
		double tmp1=calc(x,y,q[mid1]),tmp2=calc(x,y,q[mid2]);
		if(tmp1>tmp2)
			r=mid2-1;
		if(tmp1<tmp2)
			l=mid1+1;
		if(tmp1==tmp2)
			l=mid1+1,r=mid2-1;
		res=std::max(res,std::max(tmp1,tmp2));
	}
	return res;
}
int main()
{
//	freopen("rand.txt","r",stdin);
//	freopen("B.txt","w",stdout);
	n=read(),D=read();
	for(int i=1;i<=n;++i)
	{
		a[i]=read();
		s[i]=a[i]+s[i-1];
		X[i]=read();
	}
	q.push_back(0);
	for(int i=1;i<=n;++i)
	{
		ans[i]=tri_find(X[i]+i*D,s[i]);
		ans[i]+=ans[i-1];
		int tmp=q.back();
		q.pop_back();
		while(!q.empty()&&get_k(q.back(),tmp)>=get_k(tmp,i))
		{
			tmp=q.back();
			q.pop_back();
		}
		q.push_back(tmp);
		q.push_back(i);
	}
	printf("%.0lf",ans[n]);
}

回复

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

正在加载回复...