[JSOI2016]灯塔
链接:https://www.luogu.com.cn/problem/P5503
题目描述:对于每一个,求出的最大值。
题解:令第个数的答案为,打表可以发现具有决策单调性。这一类决策单调性可以采用整体二分的方式求得决策点范围,由于决策点可能相同,所以不能先取整。
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
double dp[1000001],dp2[1000001],f[1000001];
long long h[1000001],n,p[1000001],p2[1000001];
void solve(int l,int r,int L,int R)
{
int mid=(l+r)/2;
for (int i=R;i>=L;--i)
if (i<mid&&h[i]+f[mid-i]>dp[mid])
{
dp[mid]=h[i]+f[mid-i];
p[mid]=i;
}
if (l==r)
return;
solve(l,mid,L,p[mid]);
solve(mid+1,r,p[mid],R);
return;
}
void solve2(int l,int r,int L,int R)
{
int mid=(l+r)/2;
for (int i=R;i>=L;--i)
if (i>mid&&h[i]+f[i-mid]>dp2[mid])
{
dp2[mid]=h[i]+f[i-mid];
p2[mid]=i;
}
if (l==r)
return;
solve2(l,mid,L,p2[mid]);
solve2(mid+1,r,p2[mid],R);
return;
}
int main()
{
cin>>n;
for (int i=1;i<=n;++i)
{
cin>>h[i];
dp[i]=-1e18;
}
for (int i=1;i<=n;++i)
f[i]=sqrt(i);
solve(1,n,1,n);
solve2(1,n,1,n);
for (int i=1;i<=n;++i)
cout<<(int)(ceil(max(max(dp[i],dp2[i])-h[i],(double)(0))))<<endl;
return 0;
}
作者:zhouhuanyi
出处:https://www.cnblogs.com/zhouhuanyi/p/16983643.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!