CF gym 103855 M
A ( x 1 , y 1 ) A(x1,y1) A(x1,y1)和 B ( x 2 , y 2 ) B(x2,y2) B(x2,y2)的切比雪夫距离为: m a x ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) max(|x1-x2|,|y1-y2|) max(∣x1−x2∣,∣y1−y2∣)
结论: m a x ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) = ∣ x 1 + y 1 − x 2 − y 2 ∣ + ∣ x 1 − y 1 − x 2 + y 2 ∣ 2 max(|x1-x2|,|y1-y2|)={ |x1+y1-x2-y2|+|x1-y1-x2+y2| \over 2} max(∣x1−x2∣,∣y1−y2∣)=2∣x1+y1−x2−y2∣+∣x1−y1−x2+y2∣
m a x ( ∣ a ∣ , ∣ b ∣ ) = ∣ a + b ∣ + ∣ a − b ∣ 2 max(|a|,|b|)={ |a+b|+|a-b| \over 2} max(∣a∣,∣b∣)=2∣a+b∣+∣a−b∣
m i n ( ∣ p i − p j ∣ , ∣ q i − q j ∣ ) = ∣ p i − p j ∣ + ∣ q i − q j ∣ − m a x ( ∣ p i − p j ∣ , ∣ q i − q j ∣ ) min(|p_i-p_j|,|q_i-q_j|)=|p_i-p_j|+|q_i-q_j|-max(|p_i-p_j|,|q_i-q_j|) min(∣pi−pj∣,∣qi−qj∣)=∣pi−pj∣+∣qi−qj∣−max(∣pi−pj∣,∣qi−qj∣)
对于 m a x ( ∣ p i − p j ∣ , ∣ q i − q j ∣ ) = ∣ p i − p j + q i − q j ∣ + ∣ p i − p j − q i − q j ∣ 2 max(|p_i-p_j|,|q_i-q_j|)={ |p_i-p_j+q_i-q_j|+|p_i-p_j-q_i-q_j| \over 2} max(∣pi−pj∣,∣qi−qj∣)=2∣pi−pj+qi−qj∣+∣pi−pj−qi−qj∣
接下来研究 ∑ i = 1 n ∑ j = 1 n ∣ a i − a j ∣ \sum_{i=1}^n \sum_{j=1}^n |a_i-a_j| ∑i=1n∑j=1n∣ai−aj∣
对 a i a_i ai 排序后,计算一个 a i a_i ai的贡献可得:
∑ i = 1 n ∑ j = 1 n ∣ a i − a j ∣ = 2 ∑ i = 1 n a i ( 2 i − n − 1 ) \sum_{i=1}^n \sum_{j=1}^n |a_i-a_j|=2\sum_{i=1}^{n} a_i(2i-n-1) ∑i=1n∑j=1n∣ai−aj∣=2∑i=1nai(2i−n−1)
那么总问题转换为求:
∑ i = 1 n ∑ j = 1 n ∣ p i − p j ∣ + ∣ q i − q j ∣ − ∣ p i − p j + q i − q j ∣ + ∣ p i − p j − q i − q j ∣ 2 \sum_{i=1}^n \sum_{j=1}^n |p_i-p_j|+|q_i-q_j|-{ |p_i-p_j+q_i-q_j|+|p_i-p_j-q_i-q_j| \over 2} i=1∑nj=1∑n∣pi−pj∣+∣qi−qj∣−2∣pi−pj+qi−qj∣+∣pi−pj−qi−qj∣
即 ∑ i = 1 n ( 2 i − n − 1 ) ( 2 p i + 2 p j − ( p i + q i ) − ( p i − q i ) ) \sum_{i=1}^n (2i-n-1)(2p_i+2p_j-(p_i+q_i)-(p_i-q_i)) i=1∑n(2i−n−1)(2pi+2pj−(pi+qi)−(pi−qi))
#include
#define int long long
#define ull unsigned long long
void yrzr(){
int n;
std::cin>>n;
std::vector<int> p(n+1),q(n+1),a(n+1),b(n+1);
for (int i=1;i<=n;i++){
std::cin>>p[i];
}
for (int i=1;i<=n;i++){
std::cin>>q[i];
a[i]=p[i]+q[i];
b[i]=p[i]-q[i];
}
std::sort(p.begin()+1,p.end());
std::sort(a.begin()+1,a.end());
std::sort(b.begin()+1,b.end());
std::sort(q.begin()+1,q.end());
int ans=0;
for (int i=1;i<=n;i++){
ans+=(2*p[i]+2*q[i]-a[i]-b[i])*(2*i-n-1);
}
std::cout<<ans;
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int T=1;
// std::cin>>T;
while (T--){
yrzr();
}
return 0;
}