首先將坐標(biāo)系順時(shí)針旋轉(zhuǎn)45度,得到一個(gè)新的坐標(biāo)系,這個(gè)坐標(biāo)系
對(duì)應(yīng)的坐標(biāo)的manhattan距離就是原圖中的距離,然后快排,利用前綴和
數(shù)組O(N)求所有的答案,然后找最小值就行了,總時(shí)間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 .
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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