P3515 [POI2011]Lightning Conductor
首先进行一步转化
\(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的更多相关文章
- P3515 [POI2011]Lightning Conductor(决策单调性分治)
P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- 洛谷P3515 [POI2011]Lightning Conductor(决策单调性)
题意 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) ...
- P3515 [POI2011]Lightning Conductor[决策单调性优化]
给定一序列,求对于每一个$a_i$的最小非负整数$p_i$,使得$\forall j \neq i $有$ p_i>=a_j-a_i+ \sqrt{|i-j|}$. 绝对值很烦 ,先分左右情况单 ...
- [bzoj 2216] [Poi2011] Lightning Conductor
[bzoj 2216] [Poi2011] Lightning Conductor Description 已知一个长度为n的序列a1,a2,-,an. 对于每个1<=i<=n,找到最小的 ...
- 【BZOJ2216】[Poi2011]Lightning Conductor 决策单调性
[BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负 ...
- 【BZOJ】2216: [Poi2011]Lightning Conductor
题意 给一个长度为\(n\)的序列\(a_i\),对于每个\(1 \le i \le n\),找到最小的非负整数\(p\)满足 对于任意的\(j\), \(a_j \le a_i + p - \sqr ...
- BZOJ2216 : [Poi2011]Lightning Conductor
$f[i]=\max(a[j]+\lceil\sqrt{|i-j|}\rceil)$, 拆开绝对值,考虑j<i,则决策具有单调性,j>i同理, 所以可以用分治$O(n\log n)$解决. ...
- bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2216 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...
随机推荐
- js多重数组完全展开
有时候项目中会遇到多重数组,需要判断多重数组里面有没有要找的对象,强大的js就可以帮助我们 var arrTest = [1, [2, 3, [4]], 5, 6, [7, 8], [[9, [10, ...
- Python数据类型详解——列表
Python数据类型详解--列表 在"Python之基本数据类型概览"一节中,大概介绍了列表的基本用法,本节我们详细学一下列表. 如何定义列表:在[]内以英文里输入法的逗号,,按照 ...
- javaScript 基础知识汇总(五)
1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...
- 09 Scrapy框架在爬虫中的使用
一.简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.它集成高性能异步下载,队列,分布式,解析,持久化等. Scrapy 是基于twisted框架开发而来,twisted是一个 ...
- [python]多元赋值
1. 简介 将多个变量同时赋值的方法,称为多元赋值. 2. 示例一: x, y, z = 1, 2, 'a string' print x, y, z 运行结果: 1 2 a string
- D-Distance_2019牛客暑期多校训练营(第八场)
题目链接 Distance 题意 1<=nmh,q<=1e5 q个操作 1 x y z往坐标里加入一个点 2 x y z查询距离该点最近的点的距离(曼哈顿距离) 题解 做法一 将要插入的点 ...
- “玲珑杯”ACM比赛 Round #18 C -- 图论你先敲完模板(和题目一点关系都没有,dp)
题目链接:http://www.ifrog.cc/acm/problem/1146?contest=1020&no=2 题解:显然知道这是一道dp而且 dp[i]=min(dp[j]+2^(x ...
- Educational Codeforces Round 68 Editorial
题目链接:http://codeforces.com/contest/1194 A.Remove a Progre ...
- Spring@Autowired java.lang.NullPointerException 空指针
在使用@Autowired注解注入出现的空指针 java.lang.NullPointerException 可能存在的错误原因: 1.注解的扫描有问题 在xml配置了这个标签后,spring可以 ...
- 一小时入门 Python
因为需求, 需要用到py, 所以来学学py, 因为有java基础 一小时入门py语法是不成问题的, 但是仅仅入门基础语法而已, 不涉及算法,不涉及大数据,机器学习,人工智能, 但是py这么火爆,就在于 ...