首先进行一步转化

\(a_j \leq a_i + q - sqrt(abs(i - j))\)

\(a_i + q \geq a_j + sqrt(abs(i-j))\)

即 $q = max (a_j + sqrt(abs(i-j))) - a_i $

我们对\(i \geq j 和 j > i\) 分类讨论, 其实解决一种情况后将序列翻转再做一遍即可

有一种O(\(n^2\))的dp暴力应该不难想到

那么我们现在思考如何以比较优秀的时间复杂度解决

这里涉及到决策单调性

简单的说, 对于i来说, 它的答案来源是另一点j,

那么所有答案来源排成的序列\(j_1,j_2,j_3,\cdots j_n\) 具有单调性

比如: 1112255566666666678888

那么我们可以考虑对于每一个i, 它可以成为哪一段区间的答案

即一个三元组(l, r, i) 对应i控制l到r

可以二分+栈(或队列)处理

二分i和栈顶答案相等临界, 若临界小于l则弹栈重复操作

否则将新的(l, r, i) 压倒栈中

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
const int N = 500080;
struct node{
ll l, r, x;
};
deque<node> q;
ll read() {
ll x = 0, f = 1;
char c = getchar();
while (!isdigit(c)) {
if (c == '-') f = -1;
c = getchar();
}
while (isdigit(c)) {
x = (x << 3) + (x << 1) + c - '0';
c = getchar();
}
return x * f;
} //快读
ll n;
long double ans[N], a[N];
bool check(ll x,ll y,ll k) {
return a[x] + sqrt(k - x) > a[y] + sqrt(k - y);
}
void work(void) {
node k = (node){1, n, 1};
for (ll i = 2;i <= n; i++) {
if (a[i] < a[k.x]) continue; //剪枝, 如果满足则它一定不会有贡献
ll l = i, r = n, mid;
while (l <= r) {
mid = (l + r) >> 1;
if (check(k.x, i, mid)) l = mid + 1;
else r = mid - 1;
}//二分
if (l == n + 1) continue;
if (l <= k.l) {
k = q.front();
q.pop_front();
i--;
continue;
}//弹栈
k.r = r;
q.push_front(k);
k = (node){l, n, i}; //压栈
}
q.push_front(k);
k = q.back();
q.pop_back();
for (ll i = 1;i <= n; i++) {
if (k.r < i) {
k = q.back();
q.pop_back();
}
ans[i] = max(ans[i], a[k.x] + sqrt(i - k.x)); //要做两次,所以取max
}
} int main() {
n = read();
for (int i = 1;i <= n; i++)
a[i] = read(), ans[i] = a[i];
work();
for (int j = 1;j << 1 <= n; j++)
swap(a[j], a[n-j+1]), swap(ans[j], ans[n-j+1]);
//翻转
while (q.size()) q.pop_front();
work();
///*
for (int i = n;i >= 1; i--)
printf ("%d\n", int(ceil(ans[i]) - a[i]));
//*/
return 0;
}

P3515 [POI2011]Lightning Conductor的更多相关文章

  1. P3515 [POI2011]Lightning Conductor(决策单调性分治)

    P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...

  2. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

  3. 洛谷P3515 [POI2011]Lightning Conductor(决策单调性)

    题意 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) ...

  4. P3515 [POI2011]Lightning Conductor[决策单调性优化]

    给定一序列,求对于每一个$a_i$的最小非负整数$p_i$,使得$\forall j \neq i $有$ p_i>=a_j-a_i+ \sqrt{|i-j|}$. 绝对值很烦 ,先分左右情况单 ...

  5. [bzoj 2216] [Poi2011] Lightning Conductor

    [bzoj 2216] [Poi2011] Lightning Conductor Description 已知一个长度为n的序列a1,a2,-,an. 对于每个1<=i<=n,找到最小的 ...

  6. 【BZOJ2216】[Poi2011]Lightning Conductor 决策单调性

    [BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负 ...

  7. 【BZOJ】2216: [Poi2011]Lightning Conductor

    题意 给一个长度为\(n\)的序列\(a_i\),对于每个\(1 \le i \le n\),找到最小的非负整数\(p\)满足 对于任意的\(j\), \(a_j \le a_i + p - \sqr ...

  8. BZOJ2216 : [Poi2011]Lightning Conductor

    $f[i]=\max(a[j]+\lceil\sqrt{|i-j|}\rceil)$, 拆开绝对值,考虑j<i,则决策具有单调性,j>i同理, 所以可以用分治$O(n\log n)$解决. ...

  9. bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2216 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...

随机推荐

  1. (五十五)c#Winform自定义控件-管道

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  2. python入门(六)二次编码与文件操作

    二次编码 密码本: ascii -- 没有中文 英文1字节 gbk -- 英文 8b(位) 1B(字节) 中文 16b 2B unicode -- 英文32b 4B 中文32b 4B utf-8 -- ...

  3. Solr7.0搭建过程

    小李经过Elasticsearch和solr之我为什么选择solr之后决定使用使用Solr作为项目的搜索引擎,然后和同事们开始讨论细节问题. 小李:虽然我会solr4.7版本的搭建,但是人总要有点梦想 ...

  4. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  5. Spring boot 自定义 Resolver 支持 interface 类型参数

    在编写 RestController 层的代码时,由于数据实体类定义了接口及实现类,本着面向接口编程的原则,我使用了接口作为 RestController 方法的入参. 代码大致如下(省略具体业务部分 ...

  6. Vue源码中compiler部分逻辑梳理(内有彩蛋)

    目录 一. 简述 二. 编译流程 三. 彩蛋环节 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 ...

  7. mariadb报:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111 "Connection refused")

    我这边移除了mysql.sock文件后,重启服务就成功了. 还有一种情况,就是加入galera后,可能是server.cnf配置信息出了问题导致的,修改后,重新运行galera即可,数据库就可以启动成 ...

  8. Linux 中 /proc/meminfo 的含义

    做嵌入式开发对内存泄露很敏感,而对泄露的位置更加关注.本文记录一下从网上搜集的/proc/meminfo各参数的含义.还不完整,待补完. 本文地址:https://segmentfault.com/a ...

  9. Build a pile of Cubes

    version_1: def find_nb(m): # your code ii = 1 total = 0 while total < m: total = sum(each**3 for ...

  10. Mysql数据处理/行转列/列转行/分割/拼接/数据复制汇总

    mysql数据处理记录(使用的 Workbench) 生成随机数 逗号或分号拼接的字符串分割成多行 多行数据转化成用逗号拼接的字符串 将A表的数据添加到B表 一.生成随机数 生成18位:(19位就加颗 ...