BZOJ4850/BZOJ2216 JSOI2016灯塔/Poi2011Lightning Conductor(决策单调性)
2024-09-24 20:48:32
即对每个i最大化hj-hi+sqrt(|i-j|)。先把绝对值去掉,正反各做一次即可。注意到当x>y时,sqrt(x+1)-sqrt(x)<sqrt(y+1)-sqrt(y),所以若对于i选择j比选择k更优(j>k),对于i+1~n也会是这样,即满足决策单调性(虽然并不能算作dp)。
可以这样使用决策单调性优化:维护一个栈,存储当前考虑的这些位置中每个位置向哪个区间转移最优。转移时在栈中二分,然后考虑更新栈,如果新加入的位置向栈顶的整个区间转移都是最优的,直接将栈顶位置弹出,否则二分找一个区间的分割点,最后把这个新位置加入栈中即可。
寻找决策区间时小心不要把已更新过的位置算进去。注意维护决策时不能对答案取整,否则会影响决策区间。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],q[N],l[N],r[N],id[N],top;
double ans[N];
double calc(int i,int j){return a[j]-a[i]+sqrt(i-j);}
void work()
{
l[]=,r[]=n,id[]=,top=;
for (int i=;i<=n;i++)
{
int left=,right=top,x;
while (left<=right)
{
int mid=left+right>>;
if (l[mid]<=i&&r[mid]>=i) {x=mid;break;}
else if (r[mid]<i) left=mid+;
else right=mid-;
}
ans[i]=max(ans[i],calc(i,id[x]));
while (top&&l[top]>=i&&calc(l[top],id[top])<calc(l[top],i)) top--;
left=max(l[top],i),right=r[top],x=r[top]+;
while (left<=right)
{
int mid=left+right>>;
if (calc(mid,id[top])<calc(mid,i)) x=mid,right=mid-;
else left=mid+;
}
r[top]=x-;
if (x<=n) top++,l[top]=x,r[top]=n,id[top]=i;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4850.in","r",stdin);
freopen("bzoj4850.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
work();reverse(a+,a+n+),reverse(ans+,ans+n+);
work();for (int i=n;i;i--) printf("%.0f\n",ceil(ans[i]));
return ;
}
最新文章
- JavaScript作用域原理(一)——作用域链
- Duilib 实现窗口点击关闭确认退出提示
- linux C 获取当前目录的实现(转-Blossom)
- python_day2
- PHP经典算法
- [转载] 一篇文章带你了解Paxos算法
- ContentMode 几个属性
- CodeForces 678C Joty and Chocolate
- Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法[转]
- Codeforces 558E A Simple Task
- 最简单的SpringBoot整合MyBatis教程
- redis 系列20 服务器下
- Linux:Day10 程序包管理
- ABAP 常见系统表
- numpy.asmatrix的用法
- Could not load file or assembly &#39;Microsoft.EntityFrameworkCore.Relational
- [置顶] js 实现 <;input type=";file"; />; 文件上传
- R语言编程
- JavaScript ES6 Symbol.hasInstance的理解。
- iOS- 网络请求的两种常用方式【GET &; POST】的区别
热门文章
- CF 314 E. Sereja and Squares
- CakePHP Model中( 获取Session)使用Component的方法
- git 创建新项目,下载工程,合并和更新工程简单应用记录
- 【xmlHttp_Class 远程访问类】使用说明
- MySQL数据库怎么截取字符串?
- 深入理解 Vuejs 动画效果
- 在Excel里面,单元格里输入公式后只显示公式本身,不显示结果,怎么办
- Thunder团队第六周 - Scrum会议5
- Alpha项目冲刺_博客链接合集
- Coursera-Note: Internet History, Technology and Secure (1st week to 9th week)