P2671求和 洛谷前缀和
想给这道题写一个容易懂并且详细一些的题解,如下:
要求的是: ∑ i = 1 n ( x i + z i ) ( I D x + I D z ) \sum\limits_{i=1}^n(x_i+z_i)(ID_x+ID_z) i=1∑n(xi+zi)(IDx+IDz) (注: x i x_i xi是纸条编号为 I D x ID_x IDx时候的值)
我们将这个式子化简得到: ∑ i = 1 n ( x i I D x + x i I D z + z i I D x + z i I D z ) \sum\limits_{i=1}^n(x_iID_x+x_iID_z+z_iID_x+z_iID_z) i=1∑n(xiIDx+xiIDz+ziIDx+ziIDz) (*)
再观察这个题目,发现可行的一对 ( I D x , I D z ) (ID_x, ID_z) (IDx,IDz) 必须满足的条件是: I D x ID_x IDx和 I D z ID_z IDz的奇偶性必须相同,这样才能使得点y到点x和点z的距离相等,这个用数学方法很容易证明,如:
(1)若 I D y ID_y IDy为奇数:
奇数-奇数=偶数,奇数+奇数=偶数; 奇数-偶数=奇数,奇数+奇数=奇数;
(2)同理可证当 I D y ID_y IDy为偶数的情况
有了上面的结论,就可以把纸带上的点进行分类,首先根据点的奇偶性分出来两个集合,然后把每个集合内部的点根据是否是同一种颜色再分成一个个小集合(储存的是点的 I D ID ID,即奇偶性和颜色都相同的点的集合,使用变长数组 v e c t o r vector vector进行储存),储存时注意要按照 I D ID ID的大小从小到大储存,因为x是要小于z的。
当我们对小集合内部进行**(*)**式的累加时,对其使用数学手段进行优化:
假设这个小集合内部有5个点,分别以 x , y , a , b , z x,y,a,b,z x,y,a,b,z 代替,
![](http://chuantu.xyz/t6/727/1586425311x2099719707.png)
可以看到每个点都可以与其他的点相连,每个点可以连4条边,但是重复的边要去掉,那么对于这个式子: ∑ i = 1 n ( x i I D x + x i I D z + z i I D x + z i I