bzoj1597 土地購買 斜率優化

2021-07-13 08:18:11 字數 1133 閱讀 5659

農夫john準備擴大他的農場,他正在考慮n (1 <= n <= 50,000) 塊長方形的土地. 每塊土地的長寬滿足(1 <= 寬 <= 1,000,000; 1 <= 長 <= 1,000,000). 每塊土地的**是它的面積,但fj可以同時購買多快土地. 這些土地的**是它們最大的長乘以它們最大的寬, 但是土地的長寬不能交換. 如果fj買一塊3x5的地和一塊5x3的地,則他需要付5x5=25. fj希望買下所有的土地,但是他發現分組來買這些土地可以節省經費. 他需要你幫助他找到最小的經費.

* 第1行: 乙個數: n

* 第2..n+1行: 第i+1行包含兩個數,分別為第i塊土地的長和寬

* 第一行: 最小的可行費用. 4

100 1

15 15

20 5

1 100

輸入解釋:

共有4塊土地.

500fj分3組買這些土地: 第一組:100x1, 第二組1x100, 第三組20x5 和 15x15 plot. 每組的**分別為100,100,300, 總共500.

題解:首先把互相包含的矩形去掉

然後可以寫出乙個n^2的dp   f[i]=f[j]+a[i]*b[j+1];

這個式子顯然可以斜率優化.

**:

#include#include#include#include#define n 50010

using namespace std;

int cnt,num,a[n],n,b[n],g[n],l,r;

long long q[n],f[n];

struct usep[n],c[n];

bool cmp(use a,use b)

long long s(int x,int y)

long long g(int x,int y)

double work(int x,int y)

int main()

for (int i=num;i>=1;i--) a[++cnt]=c[i].x,b[cnt]=c[i].y;

for (int i=1;i<=cnt;i++){

while (l-a[i]) l++;

f[i]=f[q[l]]+(long long)a[i]*b[q[l]+1];

while (l

bzoj1597 土地購買

description 地主想買一些長方形的土地,所有的土地可以分為若干組,每一組的土地的 為這一組裡的最長的長乘上最長的寬。土地的長和寬是不能交換的,例如一塊2 5的土地和一塊5 2的土地放在一起,為5 5 25。最少花費多少錢可以買下所有的土地。input 第一行乙個數n表示一共有n塊土地。接下...

BZOJ 1597 土地購買

傳送門 思路 顯然如果不對輸入資料加以處理,這道題就只能用 o 3n o 3 n 的動態規劃來做。由於購買土地的花費等於最大的長乘以最大的寬,我們可以發現,若一塊土地的長寬比另一塊土地的長寬都大,那麼另一塊土地是沒有用的。所以我們考慮刪去另一塊。顯然這是乙個偏序問題,我們把土地按長排序。要刪去長寬都...

bzoj 1597 土地購買(斜率優化dp)

題目戳這裡 2102912 kamisama123 1597 accepted 6076 kb 152 ms c edit 1171 b 2017 06 07 19 44 16 2102894 kamisama123 1597 accepted 6080 kb 160 ms c edit 982 b...