社区讨论
斜率优化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 条回复,欢迎继续交流。
正在加载回复...