BZOJ1597土地購買 斜率優化DP

2021-08-17 00:13:42 字數 1580 閱讀 7593

description

農夫john準備擴大他的農場,他正在考慮n (1 <= n <= 50,000) 塊長方形的土地. 每塊土地的長寬滿足(1 <= 寬 <

= 1,000,000; 1 <= 長 <= 1,000,000). 每塊土地的**是它的面積,但fj可以同時購買多快土地. 這些土地的價

格是它們最大的長乘以它們最大的寬, 但是土地的長寬不能交換. 如果fj買一塊3x5的地和一塊5x3的地,則他需要

付5x5=25. fj希望買下所有的土地,但是他發現分組來買這些土地可以節省經費. 他需要你幫助他找到最小的經費.

input

* 第1行: 乙個數: n

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

output

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

sample input

4100 1

15 15

20 5

1 100

輸入解釋:

共有4塊土地.

sample output

500fj分3組買這些土地:

第一組:100x1,

第二組1x100,

第三組20x5 和 15x15 plot.

每組的**分別為100,100,300, 總共500.

這道題的dp方程相比上兩題更難推,但誰叫我們是oier呢?還是推出來了:

//我們將每塊地按x從小到大sort一遍。我們發現如果對於一塊地x,存在y,滿足f[x].x

y].x,f[x].y

//則x是對結果毫無意義的(在買y是就會順帶買x),可以直接刪去x

//當刪完所有這種x後,我們發現現在的地是按照x遞增,y遞減的順序排列的,所以:

dp[i]=dp[j]+f[i].x*f[j+1].y

dp[i]-f[i].x*f[j+1].y=dp[j]

接下去大家應該知道該幹什麼了吧?

以-f[i].x為斜率,依舊維護乙個下凸包(只不過反向)即可

#include

#define ll long long

using namespace std;

ll read()

ll n,vis[50006],re,top,r,w,dp[50006],q[50006];

struct nodef[50005],a[50006];

ll cmp(node a,node b)

double x(ll i)

double y(ll i)

double k(ll i,ll j)

int main(void)

sort(f+1,f+1+n,cmp);

for(ll i=n;i>0;i--)

for(ll i=1;i<=n;i++)

if(!vis[i]) a[++top]=f[i],dp[i]=1e18;

r=w=0;

for(ll i=1;i<=top;i++)

printf("%lld",dp[top]);

return

0;}

bzoj1597 土地購買 斜率優化

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

bzoj1597 土地購買

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

BZOJ 1597 土地購買

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