20ZR暑期联赛班 Day 2

距离

给定平面上的 n 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) max(x1x2,y1y2)

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

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

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

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

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

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} ans=i=1nj=i+1nxixj+yiyj=i=1nj=i+1nxixj+i=1nj=i+1nyiyj

到现在 x x x y y y 已经独立,分开算即可,以 x x 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} ans=i=1nj=i+1n(xixj)=(i=1nj=i+1nxi)(i=1nj=i+1nxj)=i=1n(ni)xii=1n(i1)xi=i=1n(n2i+1)xi

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

因子

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

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

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

f i = min ⁡ j ∣ i f i − j + 1 f_i = \min_{j|i} f_{i-j} + 1 fi=jiminfij+1

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

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

1 ≤ n ≤ 100000 , 1 ≤ k ≤ 2 1\le n\le 100000,1\le k\le 2 1n100000,1k2

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

  • k = 1 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) i=1nj=inu(l,r)v(l,r)=i=1nu(l,r)j=inv(l,r)

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

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

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

  • k = 2 k=2 k=2

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值