bzoj 3170 manhattan距离

系统 1582 0

首先将坐标系顺时针旋转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
      
      .
    

 

bzoj 3170 manhattan距离


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论