1. 程式人生 > >BZOJ_3210_花神的澆花集會_切比雪夫距離

BZOJ_3210_花神的澆花集會_切比雪夫距離

abs type 算法 printf fabs inpu 簡單 class def

BZOJ_3210_花神的澆花集會_切比雪夫距離

Description

在花老師的指導下,每周4都有一個集會活動,俗稱“澆水”活動。

具體澆水活動詳情請見BZOJ3153

但這不是重點

花神出了好多題,每道題都有兩個參考系數:代碼難度和算法難度

花神為了準備澆花集會的題,必須找一道盡量適合所有人的題

現在花神知道每個人的代碼能力x和算法能力y,一道題(代碼難度X算法難度Y)對這個人的不適合度為 Max ( abs ( X – x ) , abs ( Y – y ) )

也就是說無論太難還是太簡單都會導致題目不適合做(如果全按花神本人能力設題,絕對的全場爆0的節奏,太簡單,則體現不出花神的實力)

當然不是每次都如花神所願,不一定有一道題適合所有人,所以要使所有人的不合適度總和盡可能低

花神出了100001*100001道題,每道題的代碼難度和算法難度都為0,1,2,3,……,100000

Input

第一行一個正整數N,表示花神有N個學生,花神要為這N個學生選一道題

接下來N行,每行兩個空格隔開的整數x[i],y[i],表示這個學生的代碼能力和算法能力

Output

一個整數,表示最小的不合適度總和

Sample Input

3
1 2
2 1
3 3

Sample Output

3

HINT

對於100%的數據,n<=100000,0<=x[i],y[i]<=100000
可以發現不合適度用的是切比雪夫距離。 於是把(x,y)變成(x-y,x+y)轉化為曼哈頓距離求解。 如果是曼哈頓距離就可以把橫縱坐標分開來求。 可以用數學方法證明排序後中位數最優。 但有可能答案(x,y)不能用原來坐標為整數的點表示。 出現這種情況需要用(x,y-1),(x,y+1),(x-1,y),(x+1,y)幾個點帶進去取個min。 代碼:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
typedef long long ll;
int xx[N],yy[N],n;
ll ans;
int fabs(int x){return x>0?x:-x;}
ll solve(int x,int y) {
    ll re=0;
    int i;
    for(i=1;i<=n;i++) re+=fabs(xx[i]-x)+fabs(yy[i]-y);
    return re>>1;
}
int main() {
    scanf("%d",&n);
    int i,x,y;
    for(i=1;i<=n;i++) {
        scanf("%d%d",&xx[i],&yy[i]);
        x=xx[i],y=yy[i];
        xx[i]=x-y;
        yy[i]=x+y;
    }
    sort(xx+1,xx+n+1);
    sort(yy+1,yy+n+1);
    x=xx[n+1>>1],y=yy[n+1>>1];
    if(x%2==y%2) printf("%lld\n",solve(x,y));
    else printf("%lld\n",min(solve(x-1,y),min(solve(x+1,y),min(solve(x,y-1),solve(x,y+1)))));
}

BZOJ_3210_花神的澆花集會_切比雪夫距離