USACO08MAR 土地購買

2021-10-04 07:31:58 字數 1758 閱讀 4033

點此看題

首先考慮如果有乙個塊長和寬都比另乙個塊要小,那麼這個塊就沒有存在的意義了,我們可以先排序(長為第一關鍵字,寬為第二關鍵字,從小到大),然後從後往前掃,期間維護寬的最大值,如果最大值不比當前寬小,那麼這個塊沒用,我們去除完沒用的點之後再排一遍序(方法一樣)。

這樣就可以愉快的dpdp

dp了,設dp[

i]

dp[i]

dp[i

]為劃分到i

ii的最小花費,轉移如下:

d p[

i]=d

p[j]

+a[i

]×b[

j+1]

dp[i]=dp[j]+a[i]\times b[j+1]

dp[i]=

dp[j

]+a[

i]×b

[j+1

]轉移是o(n

2)

o(n^2)

o(n2

)的,我們來推一波式子,設兩個轉移點j,k

j,kj,

k(j

jd p[

j]+a

[i]×

b[j+

1]

[k]+

a[i]

×b[k

+1

]dp[j]+a[i]\times b[j+1]dp

[j]+

a[i]

×b[j

+1][k]+

a[i]

×b[k

+1]dp[

j]−d

p[k]

−b[j

+1]+

b[k+

1]

i]

\frac−b

[j+1

]+b[

k+1]

dp[j

]−dp

[k]​

i]顯然a [i

]a[i]

a[i]

是單調遞增的,−b[

i]

-b[i]

−b[i

]也是單調遞增的,隊首維護上面的式子,隊尾保證斜率單調遞增,時間複雜度o(n

)o(n)

o(n)

,貼個**。

#include

#include

using

namespace std;

#define int long long

const

int m =

50005

;int

read()

int n,m,mx,h,t,dp[m]

,q[m]

;struct node

bool

operator

<

(const node &b)

const

}s[m]

,v[m]

;intup(

int j,

int k)

intdown

(int j,

int k)

signed

main()

sort

(v+1

,v+1

+m);

for(

int i=

1;i<=m;i++

)printf

("%lld\n"

,dp[m]);

}

Usaco2008 Mar 土地購買

此題依舊是斜率優化。感覺自己做斜率優化做瘋了 滑稽 還是與先前一樣弄出dp式 這裡要著重說明一下 這裡的x,y都已經是排過序並整理了的!我們先按照x為第一關鍵字,y為第二關鍵字來從小到大 both 排序。隨後,我們發現它的y不滿足單調性。所以我們應當將其轉換一下。這樣子,我們就可以斜率優化了。設k上...

USACO12MAR 花盆(單調佇列)

有n個點 x,y 求乙個在 x 軸上的最小區間,使得它包含的所有點中的 y 的極差至少為 d x,y,d leq 10 6 將點按 x 排序,顯然 2 pointers 需要隨時維護乙個滑動視窗的最大值和最小值,顯然單調佇列 也可以用離散化 st表或者線段樹,不過多了個log include def...

usaco2013 mar 懶惰的奶牛

夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在乙個地方,然後只走很少的一段路,就能吃到盡可能多的美味的青草。有n塊草坪排列在一條直線上,第i個草坪擁有g i數量的青草,第i個草坪所在的位置是x i。奶牛貝里斯想要在直線上選擇乙個點作為他的初始點 初始點有可能和草坪的位置重合 這樣他就能吃到以這個...