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 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...
随机推荐
- JavaScript 小游戏 贪吃蛇
贪吃蛇 代码: <!DOCTYPE html><html><head> <meta charset="UTF-8"> <met ...
- java后台图片上传预检失败解决方案
1.首先因为服务器端会先发送一个option请求到后台 在后台返回一个post给页面 页面在处理post请求给接口 2.先写一个过滤器, 我们自己定义一个过滤器 package com.adtime ...
- BZOJ2038 小Z的袜子 莫队
BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...
- SpringBoot项目创建及入门基础
一:快速构建springboot项目 进入https://start.spring.io/,选择相应的springboot版本,包名,项目名,依赖 图中选择web,利用tomcat服务器进行开发 sp ...
- CodeForces 340E Iahub and Permutations 错排dp
Iahub and Permutations 题解: 令 cnt1 为可以没有限制位的填充数字个数. 令 cnt2 为有限制位的填充数字个数. 那么:对于cnt1来说, 他的值是cnt1! 然后我们对 ...
- CodeForces 980 C Posterized
Posterized 题意:将[0,255] 分成 若干段, 每一段的长度最多为k, 每一个数只能被放进一个段里, 然后每一段的数组都可以被这一段最小的数字表示, 求最小的字典序. 题解:每次一个访问 ...
- hdu Sumsets
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...
- Unity3D 客户端编程
Photon Server 和 Unity3D 数据交互: Photon Server 服务端编程 Unity3D 客户端编程. VS2017 之 MYSQL实体数据模 1:打开unity新建新项目, ...
- C#基础——事件初步
事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件.在这里将以较简单的方式呈现事件最基本的用法. 1.事件的定义 给事件下定义是一个较困难的事,因为它体现的是对象与对 ...
- Netty源码分析 (六)----- 客户端连接接入accept过程
通读本文,你会了解到1.netty如何接受新的请求2.netty如何给新请求分配reactor线程3.netty如何给每个新连接增加ChannelHandler netty中的reactor线程 ne ...