20ZR暑期联赛班 Day 2

距离

给定平面上的 n n 个点, 求它们两两之间的切比雪夫距离之和。两点之间的切比雪夫距离定义为 max ( x 1 x 2 , y 1 y 2 ) \max \left(\left|x_{1}-x_{2}\right|,\left|y_{1}-y_{2}\right|\right)

曼哈顿距离为 x 1 x 2 y 1 y 2 |x_1 - x_2| |y_1-y_2|

那么,切比雪夫距离和曼哈顿距离是可以相互转换的。

  • ( x , y ) ( x + y , x y ) (x,y) \to (x + y, x- y) 将曼哈顿距离转换成了切比雪夫距离。
  • ( x , y ) ( x + y 2 , x y 2 ) (x,y) \to (\frac{x+y}{2}, \frac{x-y}{2}) 将切比雪夫距离转换成了曼哈顿距离。

可以说,遇到切比雪夫距离就把它转换成曼哈顿距离试一试,遇到曼哈顿距离就把它转换成切比雪夫距离试一试。常见的是将切比雪夫距离转换成曼哈顿距离,用前缀和做些事情。

x = x + y , y = x y x = x + y, y = x-y 那么将答案除以二就行。那么开始推式子

a n s = i = 1 n j = i + 1 n x i x j + y i y j = i = 1 n j = i + 1 n x i x j + i = 1 n j = i + 1 n y i y j \begin{aligned} a n s &=\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left|x_{i}-x_{j}\right|+\left|y_{i}-y_{j}\right| \\ &=\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left|x_{i}-x_{j}\right|+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left|y_{i}-y_{j}\right| \end{aligned}

到现在 x x y y 已经独立,分开算即可,以 x x 为栗子,将 x x 从大到小排序来去掉绝对值

a n s = i = 1 n j = i + 1 n ( x i x j ) = ( i = 1 n j = i + 1 n x i ) ( i = 1 n j = i + 1 n x j ) = i = 1 n ( n i ) x i i = 1 n ( i 1 ) x i = i = 1 n ( n 2 i + 1 ) x i \begin{aligned} a n s &=\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left(x_{i}-x_{j}\right) \\ &=\left(\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i}\right)-\left(\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{j}\right) \\ &=\sum_{i=1}^{n}(n-i) x_{i}-\sum_{i=1}^{n}(i-1) x_{i} \\ &=\sum_{i=1}^{n}(n-2 i+1) x_{i} \end{aligned}

时间复杂度 O ( n log n ) O(n \log n) ,可以用基数排序做到线性。

因子

给定一个正整数 n n ,每次选择当前 n n 的一个因子 a a 并将 n n 减去 a a ,求至少操作几次才能让 n = 1 n = 1 。多组询问。

询问数那么多,一般是 dp 预处理了。

f i f_i 为把 i i 减到 1 1 的最少操作次数。转移比较简单

f i = min j i f i j + 1 f_i = \min_{j|i} f_{i-j} + 1

j j 是因子,可以 n \sqrt{n} 枚举,用 PR 算法可以跑的更快。

给定一棵 n n 个点的树,定义 f ( l , r ) f(l, r) 为保留这棵树上所有编号在 l l r r 之间的点的时候, 连通块的个数。求
i = 1 n j = i n f k ( i , j ) \sum_{i=1}^{n} \sum_{j=i}^{n} f^{k}(i, j)

1 n 100000 , 1 k 2 1\le n\le 100000,1\le k\le 2

求的其实是点数 - 边数。可以发现 k [ 1 , 2 ] k \in [1,2] ,那就分类讨论下

  • k = 1 k = 1

i = 1 n j = i n u ( l , r ) v ( l , r ) = i = 1 n u ( l , r ) j = i n v ( l , r ) \sum_{i=1}^{n} \sum_{j=i}^{n} u(l,r)-v(l,r) = \\ \sum_{i=1}^{n} u(l,r) - \sum_{j=i}^{n}v(l,r)

左边的式子找规律发现为 1 , 4 , 10 , 35 , 1,4,10,35,\cdots ,用通项公式可以求出 a n = n ( n + 1 ) ( n + 2 ) 6 a_n = \frac{n(n+1)(n+2)}{6}

再考虑边,对于每条边 ( x , y ) (x,y) 要求有多少个区间包括它,当然是选择的区间同时包括 x , y x,y 了。找规律可以发现是 x ( n y + 1 ) x(n-y+1)

其实 k = 2 k=2 的做法完全可以做 k = 1 k=1 ,不过学下这个思路也不错。

  • k = 2 k=2

考虑枚举一个左端点,统计右端点的贡献,所以让左端点从右向左枚举

所以维护一棵平方和的线段树即可 Link

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/107743576