二分的代码我先排除队尾完全不优的(左端点i更优直接出队),再在i介于左右端点的那个区间里二分,当二分边界L,R为左端点,右端点时爆零,当右侧改为n时AC,右端点往右的不应该是必定不优吗?(前面都出队了)为什么二分有边界从最后一个区间右端点二分不对?
h=t=0;
q[0]={1,n,0};
for(int i=1;i<=n;i++)
{
while(h<=t&&q[h].r<i)
++h;
f[i]=calc(i,q[h].shu);
ans[i]=q[h].shu;
while(h<=t&&calc(q[t].l,i)<calc(q[t].l,q[t].shu))
--t;
if(calc(n,i)<calc(n,q[t].shu))
{
int z=q[t].l,y=n;
while(z<y)
{
int mid=(z+y+1)>>1;
if(calc(mid,i)<calc(mid,q[t].shu))
y=mid-1;
else
z=mid;
}
q[t].r=z;
q[++t]={z+1,n,i};
}
}