bzoj1597 土地購買

2021-08-15 23:27:31 字數 1240 閱讀 6256

description:

地主想買一些長方形的土地,所有的土地可以分為若干組,每一組的土地的**為這一組裡的最長的長乘上最長的寬。土地的長和寬是不能交換的,例如一塊2*5的土地和一塊5*2的土地放在一起,**為5*5=25。最少花費多少錢可以買下所有的土地。

input:

第一行乙個數n表示一共有n塊土地。

接下來n行每行兩個數xi和yi分別表示每塊土地的長和寬。

output:

一行乙個數表示最小**。

把每塊地的乙個頂點對齊座標系原點,易知對於我們要考慮的每個點,都有(xi>xj || yi>yj) 如圖

dp[i]表示前i塊地最小**;

可得dp方程 dp[n]=min(dp[j]+x[j+1]*y[n])j可以推出,如果用k更新n比用j更新更優,有dp[k]-dp[j]有決策單調性,我們用佇列(?)來維護i 的最優更新。上**(略醜)

#include#includeusing namespace std;

long long dp[50005];

struct sdd[50005],dd[50005];//存地

bool com(const sd &a,const sd &b)

long long cx[50005];

struct qjque[50005];//存方案,l到r的dp用num來更新

int head=1,tail=0;

int pd(int l,int r,long long dq,long long fq)

//二分查詢i更優的位置,即方案中的l

int tot;

long long f[50005];

void push(int x)

//隊尾方案的l用x更優,隊尾方案被完全覆蓋,出棧;

if((f[k]-f[x])*dd[tot].y>dp[x]-dp[k])//x這個方案能用來更新dp

int main()

for(int i=0;ique[head].r)head++;//去掉隊頭過期元素

int k=que[head].num;

dp[i]=dp[k]+f[k]*dd[i].y;//更新i的dp

push(i);//把i方案入隊

} printf("%i64d",dp[tot]);

}

BZOJ 1597 土地購買

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

bzoj1597 土地購買 斜率優化

農夫john準備擴大他的農場,他正在考慮n 1 n 50,000 塊長方形的土地.每塊土地的長寬滿足 1 寬 1,000,000 1 長 1,000,000 每塊土地的 是它的面積,但fj可以同時購買多快土地.這些土地的 是它們最大的長乘以它們最大的寬,但是土地的長寬不能交換.如果fj買一塊3x5的...

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...