距离
给定平面上的 n 个点, 求它们两两之间的切比雪夫距离之和。两点之间的切比雪夫距离定义为 max(∣x1−x2∣,∣y1−y2∣)。
曼哈顿距离为 ∣x1−x2∣∣y1−y2∣。
那么,切比雪夫距离和曼哈顿距离是可以相互转换的。
-
(x,y)→(x+y,x−y) 将曼哈顿距离转换成了切比雪夫距离。
-
(x,y)→(2x+y,2x−y) 将切比雪夫距离转换成了曼哈顿距离。
可以说,遇到切比雪夫距离就把它转换成曼哈顿距离试一试,遇到曼哈顿距离就把它转换成切比雪夫距离试一试。常见的是将切比雪夫距离转换成曼哈顿距离,用前缀和做些事情。
令 x=x+y,y=x−y 那么将答案除以二就行。那么开始推式子
ans=i=1∑nj=i+1∑n∣xi−xj∣+∣yi−yj∣=i=1∑nj=i+1∑n∣xi−xj∣+i=1∑nj=i+1∑n∣yi−yj∣
到现在 x 和 y 已经独立,分开算即可,以 x 为栗子,将 x 从大到小排序来去掉绝对值
ans=i=1∑nj=i+1∑n(xi−xj)=(i=1∑nj=i+1∑nxi)−(i=1∑nj=i+1∑nxj)=i=1∑n(n−i)xi−i=1∑n(i−1)xi=i=1∑n(n−2i+1)xi
时间复杂度 O(nlogn),可以用基数排序做到线性。
因子
给定一个正整数 n,每次选择当前 n 的一个因子 a 并将 n 减去 a,求至少操作几次才能让 n=1。多组询问。
询问数那么多,一般是 dp 预处理了。
令 fi 为把 i 减到 1 的最少操作次数。转移比较简单
fi=j∣iminfi−j+1
j 是因子,可以 n 枚举,用 PR 算法可以跑的更快。
树
给定一棵 n 个点的树,定义 f(l,r) 为保留这棵树上所有编号在 l 和 r 之间的点的时候, 连通块的个数。求
i=1∑nj=i∑nfk(i,j)
1≤n≤100000,1≤k≤2
求的其实是点数 − 边数。可以发现 k∈[1,2],那就分类讨论下
i=1∑nj=i∑nu(l,r)−v(l,r)=i=1∑nu(l,r)−j=i∑nv(l,r)
左边的式子找规律发现为 1,4,10,35,⋯,用通项公式可以求出 an=6n(n+1)(n+2)
再考虑边,对于每条边 (x,y) 要求有多少个区间包括它,当然是选择的区间同时包括 x,y 了。找规律可以发现是 x(n−y+1)。
其实 k=2 的做法完全可以做 k=1,不过学下这个思路也不错。
考虑枚举一个左端点,统计右端点的贡献,所以让左端点从右向左枚举

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