首先$c/2=x_+y_-x_-y_=max(x_,y_)-min(x_,y_)+min(x_,y_)-max(x_,y_)$,容易發現前兩項都是定值,那麼就是要最小化後面的數字
構造:讓所有數都滿足$x\le y$,那麼必然使得$min(x_,y_)$最小,$max(x_,y_)$最大,也就是令周長最小
然後考慮最小化重量和,根據上面的構造,我們發現必須要兩者同時取到極值才能最小,也就是可以分別構造,不妨列舉最大值的位置和次大值的位置(最小值同理),一共2*2=4種狀態分類討論即可
(注意:要判定無解,因為有可能某兩個不同型別(大和小)的值同時出現在乙個點中,導致兩種情況都不符合)
1 #include2view codeusing
namespace
std;
3#define n 1000005
4int
n,mx1,mx2,mn1,mn2,ans,x[n],y[n],w[n];
5int calc(int mx1,int mx2,int mn1,int
mn2)
15swap(x[i],y[i]);16}
17return
ans;18}
19int
main()
30for(int i=0;i<2;i++)
35swap(mx1,mx2);36}
37 printf("
%lld %d
",2ll*(mx1+mx2-mn1-mn2),ans);
38 }
bzoj1105 POI2007 石頭花園SKA
很顯然的結論,x,y 與 y,x 關於 y x 對稱 那麼就可以知道所有點一定是在直線的一側 暫時不考慮移動石子的代價 這樣得出來的就是最小的籬笆長度 有一些點可以不需要動,那麼第二問分四種情況討論即可 include include include includeusing namespace s...
BZOJ3229 石子合併
description 在乙個操場上擺放著一排n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分。input 第一行是乙個數n。以下n行每行乙個數a,表示石子數目。outpu...
bzoj 2597 石頭剪刀布
利用補集轉化建圖。可以得到ans c n,3 sigma c win i 2 具體的意思就是兩個勝場會破壞乙個三元環。之後展開,注意sigma win i n n 1 2,因為比賽場次是c n,2 個,因為寫成了n,一直wa include include include include inclu...