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

Posted saigyouji-yuyuko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3515 [POI2011]Lightning Conductor[决策单调性优化]相关的知识,希望对你有一定的参考价值。

给定一序列,求对于每一个$a_i$的最小非负整数$p_i$,使得$forall j eq 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‘]+sqrt{i-j‘}$  ①

现要证$ f[j]+sqrt{i-j+1} geqslant f[j‘]+sqrt{i-j‘+1}$ ②

即证$ sqrt{i-j‘}+sqrt{i-j+1}geqslant sqrt{i-j}+sqrt{i-j‘+1}$(即想法求出一个不等式与①相加消项可得②)

即证$ sqrt{i-j‘+1}-sqrt{i-j‘}geqslant sqrt{i-j+1}+sqrt{i-j}$(上式移项)

那么把它看成关于$j$的函数看单调性,设$g(j)=sqrt{i-j+1}+sqrt{i-j}$

对其求导,$g‘(j)=[(i-j+1)^{frac{1}{2}}]‘ - [(i-j)^{frac{1}{2}}]‘=-frac{1}{2} (i-j+1)^{-frac{1}{2}} + frac{1}{2} (i-j)^{-frac{1}{2}}=frac{1}{2} (frac{1}{sqrt{i-j}}-frac{1}{sqrt{i-j+1}})$

由$ i-j<i-j+1$知$frac{1}{2} (frac{1}{sqrt{i-j}}-frac{1}{sqrt{i-j+1}}) > 0$则函数$g(j)$单调增,则上不等式成立,满足单调性。

希望自己以后就按照这种方法想,虽然并卵。

证完决策单调性优化即可。


错误记录:第二次写的时候line37写成l<r了,,丢人。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef double db;
 5 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
 6 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
 7 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
 8 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
 9 template<typename T>inline T read(T&x){
10     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==-)f=1;
11     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
12 }
13 const int N=500000+7;
14 struct kochiya_sanae{
15     int l,r,pos;
16     kochiya_sanae(int l0=0,int r0=0,int pos0=0):l(l0),r(r0),pos(pos0){}
17 }q[N];
18 db sq[N],f[N],h[N];
19 int n,l,r;
20 inline void preprocess(){for(register int i=1;i<=n;++i)sq[i]=sqrt((db)i);}
21 inline db calc(int j,int i){return (db)h[j]+sq[i-j];}
22 inline int find_pos(int L,int R,int j,int i){
23     ++R;int mid;
24     while(L<R){
25         mid=L+R>>1;
26         if(calc(j,mid)<=calc(i,mid))R=mid;
27         else L=mid+1;
28     }
29     return R;
30 }
31 inline void dp(){
32     q[l=r=1]=kochiya_sanae(0,n,0);
33     for(register int i=1;i<=n;++i){
34         if(q[l].r<i)++l;else ++q[l].l;
35         MAX(f[i],calc(q[l].pos,i)-h[i]);
36         while(l<=r&&calc(q[r].pos,q[r].l)<=calc(i,q[r].l))--r;
37         if(r<l)q[r=l]=kochiya_sanae(i,n,i);
38         else{
39             int k;
40             if(calc(q[r].pos,q[r].r)>calc(i,q[r].r))k=q[r].r+1;
41             else k=find_pos(q[r].l,q[r].r,q[r].pos,i);
42             if(k<=n)q[r].r=k-1,q[++r]=kochiya_sanae(k,n,i);
43         }
44     }
45 }
46 
47 int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);
48     read(n);for(register int i=1;i<=n;++i)read(h[i]);h[0]=-3;
49     preprocess();dp();reverse(h+1,h+n+1);reverse(f+1,f+n+1);dp();
50     for(register int i=n;i;--i)printf("%d
",(int)ceil(f[i]));
51     return 0;
52 }

 

以上是关于P3515 [POI2011]Lightning Conductor[决策单调性优化]的主要内容,如果未能解决你的问题,请参考以下文章

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

P3515 [POI2011]Lightning Conductor (四边形不等式优化)

@bzoj - 2216@ [Poi2011]Lightning Conductor

[POI2011]Lightning Conductor

「POI2011」Lightning Conductor

[POI2011]Lightning Conductor