首先將坐標系順時針旋轉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 .
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
