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 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...
随机推荐
- Python Web 之 Flask
FLASK 一.概述 flask是一个基于python并依赖于Jinja2模板引擎和WerkZeug WSGI(Web Server Gatewey InterFace.web)服务的框架 WSGI: ...
- javaScript 基础知识汇总(五)
1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...
- 持续集成高级篇之Jenkins资源调度
系列目录 之前的示例我们主要关注点在于功能的实现,都是在一个节点的完成了.有了多个节点后,必须涉及到资源的调度问题.本节我们讲解在创建任务时与资源调度的有关选项以及一些平时没有注意到的但在生产环境需要 ...
- codeforces 454 D. Little Pony and Harmony Chest(状压dp)
题目链接:http://codeforces.com/contest/454/problem/D 题意:给定一个序列a, 求一序列b,要求∑|ai−bi|最小.并且b中任意两数的最大公约数为1. 题解 ...
- CF1003D Coins and Queries 贪心
Coins and Queries time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- yzoj1657货仓选址 题解
题面: 在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N].现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品.为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的 ...
- .NET Core 微信小程序支付——(统一下单)
最近公司研发了几个电商小程序,还有一个核心的电商直播,只要是电商一般都会涉及到交易信息,离不开支付系统,这里我们统一实现小程序的支付流程(与服务号实现步骤一样). 目录1.开通小程序的支付能力2.商户 ...
- Java的8种基本数据类型的内存占用字节数和取值范围
这是8中基本类型的内存中占用字节数(取值范围是2的(字节数X8-1)次方) 1.整型 类型 存储需求 bit数 取值范围 byte 1字节 1*8 -128-127 short 2字节 2*8 -32 ...
- [币严区块链]简单易懂的以太坊(ETH)智能合约开发入门教程
以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开发应用 ...
- 我真的不想再用 JPA 了
在开发者的圈子里,没当说到一种技术好或者不好,都会引发激烈或者不激烈的争论,直到一个开发者出来说 PHP 是世界上最好的语言,大家伙儿才会纷纷退去继续写代码. 今天说 JPA 的问题不是想引发什么讨论 ...