警示后人
查看原帖
警示后人
767681
catandcode楼主2023/5/13 16:54

如果你写了这样的代码:

		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]);
			}
		}

每一个 ff 数组的值从前一个开始,省略一个循环,这个优化其实是反向的,消除了一个 kk 的常数,但增加了一个 nknk 的常数,会 TT 飞。

另外要注意,分治区域可能有大于 kk 个 11 ,因此内部循环要到 k+1k+1。

2023/5/13 16:54
加载中...