【BZOJ】2216: [Poi2011]Lightning Conductor
题意
给一个长度为\(n\)的序列\(a_i\),对于每个\(1 \le i \le n\),找到最小的非负整数\(p\)满足 对于任意的\(j\), \(a_j \le a_i + p - \sqrt{|i-j|}\)
分析
我们正反dp一下。
题解
令\(d(i)\)表示最小的\(p\),则\(d(i) = max(a_j+\sqrt{i-j})-a_i, j < i\)。
其实发现这是有决策单调性的。即对于决策\(j\)和\(k(j > k)\),如果\(j\)在\(i\)时比\(k\)在\(i\)优了,则对于所有\(x > i\),决策\(j\)都比决策\(k\)优。所以我们用一个栈来维护一下最优区间即可,更新区间用二分,复杂度\(O(nlogn)\)。
#include <bits/stdc++.h>
using namespace std;
typedef double lf;
inline int getint() {
int x=0, c=getchar();
for(; c<48||c>57; c=getchar());
for(; c>47&&c<58; x=x*10+c-48, c=getchar());
return x;
}
const int N=500005;
struct ip {
int id, l, r;
}q[N];
int n, a[N];
inline lf cal(int j, int i) {
return a[j]-a[i]+sqrt(i-j);
}
void dp(lf *f) {
ip *fr=q, *ta=q;
*ta++=(ip){1, 2, n};
for(int i=2; i<=n; ++i) {
for(; fr+1!=ta && (fr+1)->l<=i; ++fr);
f[i]=cal(fr->id, i);
++fr->l;
for(; fr!=ta && fr->l>fr->r; ++fr);
for(; fr!=ta && cal((ta-1)->id, (ta-1)->l)<cal(i, (ta-1)->l); --ta);
if(fr!=ta) {
ip *b=ta-1;
int l=b->l, r=b->r;
while(l<=r) {
int mid=(l+r)>>1;
if(cal(b->id, mid)<cal(i, mid)) {
r=mid-1;
}
else {
l=mid+1;
}
}
++r;
if(r<=n) {
b->r=r-1;
*ta++=(ip){i, r, n};
}
}
else {
*ta++=(ip){i, i+1, n};
}
}
}
lf f[N], g[N];
int main() {
n=getint();
for(int i=1; i<=n; ++i) {
a[i]=getint();
}
dp(f);
reverse(a+1, a+1+n);
dp(g);
for(int i=1; i<=n; ++i) {
printf("%d\n", max(0, int(ceil(max(f[i], g[n-i+1])))));
}
return 0;
}
【BZOJ】2216: [Poi2011]Lightning Conductor的更多相关文章
- [bzoj 2216] [Poi2011] Lightning Conductor
[bzoj 2216] [Poi2011] Lightning Conductor Description 已知一个长度为n的序列a1,a2,-,an. 对于每个1<=i<=n,找到最小的 ...
- bzoj 2216: [Poi2011]Lightning Conductor【决策单调性dp+分治】
参考:https://blog.csdn.net/clove_unique/article/details/57405845 死活不过样例看了题解才发现要用double.... \[ a_j \leq ...
- bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2216 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...
- 【BZOJ】2277: [Poi2011]Strongbox
题意 有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码.如果\(a\)和\(b\)都是它的密码,那么\((a+b)%n\)也是它的密码(\(a,b\)可以相等).某人试了\(k\)次密码 ...
- 【BZOJ】2212: [Poi2011]Tree Rotations
题意 给一棵\(n(1 \le n \le 200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 分析 可以发现如果交换非叶结点的左右子树,对子树内的交换无影响, ...
- 【BZOJ2216】[Poi2011]Lightning Conductor 决策单调性
[BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负 ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
随机推荐
- Install PIL on mac osX10.9
follow this instruction: http://blog.csdn.net/liushuaikobe/article/details/8729652 and if you encoun ...
- C# 将文件转化成byte[]数组
/// <summary> /// 将文件转换成byte[] 数组 /// </summary> /// <param name="fileUrl"& ...
- 攻城狮在路上(叁)Linux(十九)--- 磁盘分区
磁盘分区使用fdisk命令,该命令仅root有使用权限. 磁盘分区的一般步骤: 1.首先用df命令查看设备名 df -h; 2.fdisk /dev/sda; <== 按m显示help d:删除 ...
- Oracle备份 还原命令
1.备份命令 exp username/password file=d:/test/test.dmp; 2.还原命令 imp username/password full=y file=d:/test ...
- hdu 3236 二维背包
明天来一发 hdu 4501 算是这题的简化版吧
- 避免在ASP.NET Core中使用服务定位器模式
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...
- ASP.NET的新成员ASP.NET WebHooks
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:前几天微软除了发布了ASP.NET 5的Beta7之外,还有一个值得关注的东西,就是A ...
- WebRTC之带宽控制部分学习(1) ------基本demo的介绍
转自:http://blog.csdn.net/u013160228/article/details/46392037 WebRTC的代码真是非常之大啊,下载以及编译了我好几天才搞完..... 可以看 ...
- LaTex学习笔记(一)
1. 语法 命令 普通命令 环境 数据 注释 2. 物理结构 导言 指定文档类型,引入宏包,定义命令,环境等 \documentclass[options]{class} \usepackage[op ...
- js jquery 实现点击按钮后,倒计时60秒才能再次点击发送验证邮件
<input type="button" id="btn" value="免费获取验证码" /><script type= ...