如果你写了这样的代码:
f[0][0]=f[1][0]=mid,f[0][K+2]=x1,f[1][K+2]=x2;
for(int i=yy1;i<=y2;++i) {
for(int j=i+1;j<=y2;++j) {
for(int k=K+1;k>=1;--k) {
f[0][k]=f[0][k+1],f[1][k]=f[1][k+1];
while(sum(f[0][k],mid,i,j)>=k) ++f[0][k];
while(sum(mid,f[1][k],i,j)>=k) --f[1][k];
}
for(int k=0;k<=K;++k) ans+=1ll*(f[0][k]-f[0][k+1])*(f[1][K-k+1]-f[1][K-k]);
}
}
每一个 f 数组的值从前一个开始,省略一个循环,这个优化其实是反向的,消除了一个 k 的常数,但增加了一个 nk 的常数,会 T 飞。
另外要注意,分治区域可能有大于 k 个 1 ,因此内部循环要到 k+1。