返回值为在最优条件下使用最少点数
int Gans(ll del,int n)
{
int hd=1,tl=0;
st[0]=1;
qu[++tl]=0;
for(int i=1;i<=n;i++)
{
while(hd<tl&&st[qu[hd+1]]<=i)++hd;
int now=qu[hd];
f[i]=G(i,now)+del;
use[i]=use[now]+1;
while(hd<=tl)
{
int now=qu[tl];
int ch=max(i+1,st[now]);
if(G(ch,now)>G(ch,i))--tl;
else break;
}
if(hd<=tl){
int now=qu[tl];
int l=max(st[now],i+1),r=n;
while(l<=r){
int mid=(l+r)>>1;
if(G(mid,now)>G(mid,i))r=mid-1;
else l=mid+1;
}
st[i]=l;
if(G(n,i)<G(n,now))qu[++tl]=i;
}
else qu[++tl]=i,st[i]=i+1;
}
return use[n];
}