最开始的时候二分答案中的 check() 是这样写的
bool check(ll t){
ll group=1,cnt=0,r=n;
for(int i=n;i>=1;i--){
ll now=ask(a[i]);
if(cnt+now<=t)cnt+=now,add(a[i],1);
else remove(i+1,r),cnt=0,r=i,group++,add(a[i],1);
}
remove(1,r);
if(group<=k)return 1;
else return 0;
}
但是 WA了,我把循环顺序从倒序该为顺序就 A 了。
bool check(ll t){
ll group=1,cnt=0,r=n;
for(int i=n;i>=1;i--){
ll now=ask(a[i]);
if(cnt+now<=t)cnt+=now,add(a[i],1);
else remove(i+1,r),cnt=0,r=i,group++,add(a[i],1);
}
remove(1,r);
if(group<=k)return 1;
else return 0;
}
这是为什么,能否有人解释一下,或者提供一组卡掉我程序的数据也好。