刚学四边形,求助

P3515 [POI2011] Lightning Conductor

``` #include<bits/stdc++.h> using namespace std; #define val(j,i) a[j]+sq[i-j] int read(){ int ss=0,ww=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') ww=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ ss=ss*10+ch-'0'; ch=getchar(); } return ss*ww; } const int N=500010; int a[N],n; double f[N],sq[N]; struct dat{ int j; int l; int r; }q[N]; int head,tail; void insert(int i){ int pos=n+1; while(head<=tail&&val(q[tail].j,q[tail].l)<=val(i,q[tail].l)){ pos=q[tail].l; tail--; } if(head>tail){ tail++; q[tail].l=i; q[tail].r=n; q[tail].j=i; return; } if(val(i,q[tail].r)>=val(q[tail].j,q[tail].r)){ int l=q[tail].l; int r=q[tail].r; while(l<r){ int mid=(l+r)/2; if(val(i,mid)>=val(q[tail].j,mid)) r=mid; else l=mid+1; } pos=r; q[tail].r=r-1; } if(pos!=n+1){ tail++; q[tail].j=i; q[tail].l=pos; q[tail].r=n; } } void solve(){ head=1; tail=0; for(int i=1;i<=n;i++){ insert(i); if(q[head].r<i) head++; q[head].l=i; f[i]=max(f[i],val(q[head].j,i)); } } int main(){ n=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) sq[i]=sqrt(i); solve(); for(int i=1;i<=n/2;i++){ swap(f[i],f[n-i+1]); swap(a[i],a[n-i+1]); } solve(); for(int i=n;i>=1;i--) printf("%d\n",max((int)(ceil(f[i]))-a[i],0)); return 0; } ```
by MeowScore @ 2022-04-22 18:06:10


呃,标题打错了,是“四边形不等式”
by MeowScore @ 2022-04-22 18:06:55


@[Liu_Kevin](/user/140360) %%%蒟蒻dp还没学好
by DeepWinter @ 2022-04-22 18:17:28


@[Liu_Kevin](/user/140360) 您好,久仰大名。 ```cpp while(head<=tail&&val(q[tail].j,q[tail].l)<=val(i,q[tail].l)){ pos=q[tail].l; tail--; } if(head>tail){ tail++; q[tail].l=i; q[tail].r=n; q[tail].j=i; return; } ``` 改成 ```c while(head<tail&&val(q[tail].j,q[tail].l)<=val(i,q[tail].l)){ pos=q[tail].l; tail--; } ``` 栈首元素不保证 r >= i
by CodingJellyfish @ 2022-04-22 20:41:40


@[DoctorJellyfish](/user/52381) 神仙太巨了 Orz 您 tql I am a noob
by MeowScore @ 2022-04-22 22:04:24


|