zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    [Ramda] Create a Query String from an Object using Ramda's toPairs function
    UVA 10285 Longest Run on a Snowboard(记忆化搜索)
    为什么鲍尔默现在说要辞职?
    c++中经常需要访问对象中的成员的三种方式
    【实用技术】DreamWeaver常用快捷键
    Objective-C中NSString和NSMutableString的基本用法
    《数据通信与网络》笔记--IPSec
    最小费用最大流模板 poj 2159 模板水题
    UVa 10192: Vacation
    C++按值和按址传递对象的思考和优化
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3496082.html
Copyright © 2011-2022 走看看