决策单调性二分队列板子,但看不懂注释这行什么意思。
for(int i=1;i<=n;i++){
if(hh<=tt&&q[hh].r<i) hh++;
else q[hh].l=i;
f[i]=f[q[hh].opt]+w(q[hh].opt+1,i);
while(hh<=tt&&f[i]+w(i+1,q[tt].l)<=f[q[tt].opt]+w(q[tt].opt+1,q[tt].l)) tt--;
int l=q[tt].l,r=q[tt].r;
while(l<r){
int mid=(l+r)>>1;
if(f[i]+w(i+1,mid)<=f[q[tt].opt]+w(q[tt].opt+1,mid)) r=mid;
else l=mid+1;
}
if(l>q[tt].l) q[tt].r=l-1;
else if(hh<=tt) tt--;
if(l<=n) q[++tt]=(node){l,n,i};
}