最近又做了一遍P3957,一开始WA了,改了一下就过了。
int ck(int g){
int h=1,t=0,l=0;
fill(f+1,f+n+1,-inf);
F(i,1,n){
while(h<=t&&x[i]-x[q[h]]>d+g) h++;
while(l<i&&x[i]-x[l]>=d-g){
while(h<=t&&f[l]>=f[q[t]])t--;
q[++t] = l++;
}if(h<=t)f[i]=f[q[h]]+s[i];
if(f[i]>=k) return 1;
}return 0;
}
int ck(int g){
int h=1,t=0,l=0;
fill(f+1,f+n+1,-inf);
F(i,1,n){
while(l<i&&x[i]-x[l]>=d-g){
while(h<=t&&f[l]>=f[q[t]])t--;
q[++t] = l++;
}
while(h<=t&&x[i]-x[q[h]]>d+g) h++;
if(h<=t)f[i]=f[q[h]]+s[i];
if(f[i]>=k) return 1;
}return 0;
}
注意到我只是调换了删除队头和加入队尾的操作,为什么会导致WA呢。