距离
给定平面上的
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。