[决策单调性][整体二分] Bzoj P2216 Lightning Conductor

Description

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

Input

第一行n,(1<=n<=500000)
下面每行一个整数,其中第i行是ai。(0<=ai<=1000000000)

Output

n行,第i行表示对于i,得到的p

Sample Input

6
5
3
2
4
2
4

Sample Output

2
3
5
3
5
4

题解

  • 随手化简就可以得到p>=aj-ai+sqrt(|i-j|)
  • 我们发现其实只要求max(aj+sqrt(|i-j|))就好了
  • 不难发现这是有决策单调性的,那么就可以用整体二分来实现
  • 具体方法是二分一个中点mid,然后暴力求出mid的值,再把序列分成两半即可

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <cstdlib>
 7 using namespace std;
 8 const int N=500010;
 9 int n,a[N],id[N];
10 double ans[N],f[N];
11 double get(int x,int y) { return a[x]+f[abs(x-y)]; }
12 void cdq(int l,int r,int L,int R)
13 {
14     if (l>r) return;
15     int mid=l+r>>1,pos=0; double mx=0;
16     for (int i=L;i<=R&&i<=mid;i++) if (get(i,mid)>mx) mx=get(i,mid),pos=i;
17     ans[id[mid]]=max(ans[id[mid]],mx),cdq(l,mid-1,L,pos),cdq(mid+1,r,pos,R);
18 }
19 int main()
20 {
21     scanf("%d",&n);
22     for (int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=sqrt(i),id[i]=i;
23     cdq(1,n,1,n);
24     for (int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]),swap(id[i],id[n-i+1]);
25     cdq(1,n,1,n);
26     for (int i=1;i<=n;i++) printf("%d\n",(int)ceil(ans[i]-a[n-i+1]));
27 } 

原文地址:https://www.cnblogs.com/Comfortable/p/11145893.html

时间: 2024-08-02 23:14:12

[决策单调性][整体二分] Bzoj P2216 Lightning Conductor的相关文章

BZOJ 2216 Lightning Conductor

决策单调.整体二分. #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define maxn 500500 using namespace std; int n,a[maxn],f[maxn],g[maxn]; void dp1(int left,int right,int l,int r) { if (left&

@bzoj - [email&#160;protected] [Poi2011]Lightning Conductor

目录 @[email protected] @[email protected] @part - [email protected] @part - [email protected] @part - [email protected] @accepted [email protected] @version - [email protected] @version - [email protected] @[email protected] @[email protected] 已知一个长度为

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

[BZOJ2216][Poi2011]Lightning Conductor Description 已知一个长度为n的序列a1,a2,...,an.对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) Input 第一行n,(1<=n<=500000)下面每行一个整数,其中第i行是ai.(0<=ai<=1000000000) Output n行,第i行表示对于i,得到的p Sample I

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

P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下面给一张图证明这是满足决策单调性的 把$a_j+sqrt(i-j)$表示在坐标系上 显然$sqrt(i-j)$的增长速度趋缓 曲线$a$被曲线$b$超过后是无法翻身的 对两个方向进行决策单调性分治,取$max$即可 #include<iostream> #include<cstdio>

bzoj2216: [Poi2011]Lightning Conductor(分治决策单调性优化)

每个pi要求 这个只需要正反DP(?)一次就行了,可以发现这个是有决策单调性的,用分治优化 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int maxn=500010,inf=1e9; int n; int a[

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

给定一序列,求对于每一个$a_i$的最小非负整数$p_i$,使得$\forall j \neq i $有$ p_i>=a_j-a_i+ \sqrt{|i-j|}$. 绝对值很烦 ,先分左右情况单独做.现在假设j都在i左边,则$p_i=max{a_j-a_i+ \sqrt{i-j}}=max{a_j+ \sqrt{i-j} }-a_i$.带根号,不易斜率优化,考虑证决策单调性. 假设最优决策为j,j之前的任意决策称之为$j'$,则有 $f[j]+\sqrt{i-j} \geqslant f[j']

Bzoj 1563: [NOI2009]诗人小G(决策单调性优化)

原题面 带有详细证明的转这里 题意:每一个线段有一个长度,有一个标准长,现在要把这些线段按照顺序分行,每行的不和谐值等于标准长和该行线段总长的差的绝对值的p次方.现在要求最小的不和谐值之和. 开始的时候完全读错题了,以为p==2 for ever.真是太天真.后来看数据范围才发现.我真是面向数据编程? n^2的dp是一眼秒的.然后如果是p=2,那就是一个非常像玩具装箱的斜率优化dp.对于4.5的数据范围.可以想到用贪心优化dp.因为每一行的长度不会通过拼接线段(线段条数>=2)达到2*标准长,这

bzoj 2527 Meteors - 整体二分 - 树状数组

Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The planet is unsuitable for colonisation due to strange meteor showers, which on the other hand make it an exceptionally interesting object of st

BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N,M<=50000,N,M<=50000a<=b<=N1操作中abs(c)<=N2操作中c<=Maxlongint 之前用树套树抄过一次...然而我并不适合写那玩意儿... 加上时间序的整体二分 普通的整体二分先处理了所有$[l,mid]$的影响因子在计算询问的答案来分组