CF gym 103855 M 切比雪夫距离转换

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(x1x2∣,y1y2∣)

结论: 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(x1x2∣,y1y2∣)=2x1+y1x2y2∣+x1y1x2+y2∣
m a x ( ∣ a ∣ , ∣ b ∣ ) = ∣ a + b ∣ + ∣ a − b ∣ 2 max(|a|,|b|)={ |a+b|+|a-b| \over 2} max(a,b)=2a+b+ab

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(pipj,qiqj)=pipj+qiqjmax(pipj,qiqj)
对于 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(pipj,qiqj)=2pipj+qiqj+pipjqiqj

接下来研究 ∑ i = 1 n ∑ j = 1 n ∣ a i − a j ∣ \sum_{i=1}^n \sum_{j=1}^n |a_i-a_j| i=1nj=1naiaj
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=1nj=1naiaj=2i=1nai(2in1)

那么总问题转换为求:
∑ 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=1nj=1npipj+qiqj2pipj+qiqj+pipjqiqj
∑ 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=1n(2in1)(2pi+2pj(pi+qi)(piqi))

#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;
}

你可能感兴趣的:(数学,算法)