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 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...
随机推荐
- Joyful HDU - 5245 概率问题
Sakura has a very magical tool to paint walls. One day, kAc asked Sakura to paint a wall that looks ...
- codeforces 814 C. An impassioned circulation of affection(二分+思维)
题目链接:http://codeforces.com/contest/814/problem/C 题意:给出一串字符串然后q个询问,问替换掉将m个字符替换为字符c,能得到的最长的连续的字符c是多长 题 ...
- CF1072A Palindromic Twist 思维
Palindromic Twist time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 洛谷 题解 P3871 【[TJOI2010]中位数】
这题先定义一个大根堆(maxn)维护mid(n为奇数mid+1)的元素.再定义一个小根堆(minn)维护mid(n为奇数mid+1)到n的元素.然后对于插入元素的情况进行分类讨论. 当add x时 一 ...
- JS-特效 ~ 01. 事件对象、offset偏移/检测、无缝滚动、自动循环轮播图
Math.round ( ) :正书四舍五入,负数五舍六入 用定时器,先清除定时器 事件对象 event event:事件被触动时,鼠标和键盘的状态,通过属性控制 Offset:偏移,检测 1. 获取 ...
- 【LeetCode】[0001] 【两数之和】
题目描述 思路分析 Java代码 代码链接 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标.你可以假设每种输入只会对 ...
- SpringCloud 学习(二)-2 :Securing The Eureka Server
由于工作等种种原因未能连续进行学习,现在继续学习微服务,不过是新建的demo,springcloud版本用的是Finchley.SR2. 之前用简单demo实现了注册中心,现在来对注册中心加安全验证: ...
- Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...
- JavaScript 基础入门
JavaScript 基础入门 JavaScript 的组成 JS 由三部分组成,它们分别是:ECMAScript.DOM.BOM. ECMAScript 因为网景开发了JavaScrip ...
- ASP.NET Core SignalR:集线器Hubs
一.什么是集线器hubs 通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法.SignalR负责实现了客户端和服务器之 ...