• bzoj 3170 manhattan距离


    首先将坐标系顺时针旋转45度,得到一个新的坐标系,这个坐标系

    对应的坐标的manhattan距离就是原图中的距离,然后快排,利用前缀和

    数组O(N)求所有的答案,然后找最小值就行了,总时间O(NlogN),今天

    体力不足,在此不再赘述。。。

    /**************************************************************
        Problem: 3170
        User: BLADEVIL
        Language: Pascal
        Result: Accepted
        Time:860 ms
        Memory:19756 kb
    ****************************************************************/
     
    //By BLADEVIL
    var
        n                       :int64;
        size                    :array[0..2,0..500010] of int64;
        ans                     :array[0..500010] of int64;
        sum                     :array[0..500010] of int64;
        print                   :int64;
         
    function min(a,b:int64):int64;
    begin
        if a>b then min:=b else min:=a;
    end;
         
    procedure swap(var a,b:int64);
    var
        c                       :int64;
    begin
        c:=a; a:=b; b:=c;
    end;
         
    procedure init;
    var
        i                       :longint;
        x, y                    :int64;
    begin
        read(n);
        for i:=1 to n do
        begin
            read(x,y);
            size[1,i]:=x+y;
            size[2,i]:=y-x;
        end;
    end;
     
    procedure qs(low,high,s:int64);
    var
        i, j, xx                :int64;
    begin
        i:=low; j:=high; xx:=size[s,(i+j) div 2];
        while i<j do
        begin
            while size[s,i]<xx do inc(i);
            while size[s,j]>xx do dec(j);
            if i<=j then
            begin
                swap(size[1,i],size[1,j]);
                swap(size[2,i],size[2,j]);
                swap(ans[i],ans[j]);
                inc(i); dec(j);
            end;
        end;
        if i<high then qs(i,high,s);
        if j>low then qs(low,j,s);
    end;
     
    procedure main;
    var
        i                       :longint;
    begin
        qs(1,n,1);
        for i:=1 to n do sum[i]:=int64(size[1,i]);
        for i:=1 to n do sum[i]:=sum[i]+sum[i-1];
        for i:=1 to n do
            ans[i]:=((i-1)*size[1,i]-sum[i-1])+((sum[n]-sum[i])-(n-i)*size[1,i]);
        qs(1,n,2);
        for i:=1 to n do sum[i]:=int64(size[2,i]);
        for i:=1 to n do sum[i]:=sum[i]+sum[i-1];
        for i:=1 to n do
            ans[i]:=ans[i]+((i-1)*size[2,i]-sum[i-1])+((sum[n]-sum[i])-(n-i)*size[2,i]);
        print:=maxlongint*maxlongint;
        for i:=1 to n do print:=min(print,ans[i]);
        print:=print div 2;
        writeln(print);
    end;
     
    begin
        init;
        main;
    end.
  • 相关阅读:
    apk获取后台源代码
    Oracle用其中一个表的数据更新另一个表
    As的LogCat打开方法
    任意东西转Json
    将一个实体中相同字段的值赋值给另一个实体
    request乱码,又不能改request本身编码格式时可以进行转码
    oracle触发器
    搭建AS时各种报错解决方法(32位AMD)
    计算两个时间之间相差了多少时间
    thinkphp支持query查询
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3496082.html
Copyright © 2020-2023  润新知