P1714切蛋糕 不定區間最值

2022-05-31 13:45:18 字數 1365 閱讀 4655

題面

今天是小z的生日,同學們為他帶來了一塊蛋糕。這塊蛋糕是乙個長方體,被用不同色彩分成了n個相同的小塊,每小塊都有對應的幸運值。

小z作為壽星,自然希望吃到的第一塊蛋糕的幸運值總和最大,但小z最多又只能吃m小塊(m≤n)的蛋糕。

吃東西自然就不想思考了,於是小z把這個任務扔給了學oi的你,請你幫他從這n小塊中找出連續的k塊蛋糕(k≤m),使得其上的幸運值最大。

不定區間長度還是第一次遇到

分析 考慮樸素寫法,非常直觀。

對於以第i個元素結尾的子段,最大的子段和p(i)可以表示為

p [ i ] = max ,j屬於 [ i-m , i-1 ]

顯然,在每次獲取 p [ i ] 的時候,sum [ i ] 是定值,所以 p [ i ] 由 sum [ j ] 的最小值確定。

於是我們就要想方設法在優於o(m)的時間內實現獲取最小的 sum [ j ] 。

最優時,sum [ j ] 的性質:

(1)sum [ j ] ≤ sum [ x ]  x∈ [ i-m , i-1 ]且x≠j

(2)j∈[ i-m , i-1 ]

列舉加優化

考慮設計這樣乙個資料結構,在更低的時間複雜度內獲取最優sum [ j ] 。

①單調佇列

#include using

namespace

std;

#define max(a,b) (a>b?a:b)

const

int maxn=500009

;int

a[maxn],zhui[maxn];

int q[maxn],p[maxn],ans=-9999999

,spfa[maxn];

intmain()

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

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

ans=max(ans,zhui[i]-spfa[i-1

]); cout

<

}

view code

②st稀疏表

#include using

namespace

std;

const

int maxn=500009

;int

a[maxn],zhui[maxn];

int ans=-9999999,dis[maxn][22

];int query(int l,int

r)int

main()

for(int j=1;j<=log2(n);j++)

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

cout

<

}

view code

洛谷 P1714 切蛋糕

題目描述 今天是小z的生日,同學們為他帶來了一塊蛋糕。這塊蛋糕是乙個長方體,被用不同色彩分成了n個相同的小塊,每小塊都有對應的幸運值。小z作為壽星,自然希望吃到的第一塊蛋糕的幸運值總和最大,但小z最多又只能吃m小塊 m n 的蛋糕。吃東西自然就不想思考了,於是小z把這個任務扔給了學oi的你,請你幫他...

P1714 切蛋糕 單調佇列

p1714 切蛋糕 單調佇列 gyro永不抽風 最後更新 2020年09月20日 18 09 許可協議 今天是小z的生日,同學們為他帶來了一塊蛋糕。這塊蛋糕是乙個長方體,被用不同色彩分成了n個相同的小塊,每小塊都有對應的幸運值。小z作為壽星,自然希望吃到的第一塊蛋糕的幸運值總和最大,但小z最多又只能...

P1714 切蛋糕 蛋糕的最大幸運值

題目描述 今天是小z的生日,同學們為他帶來了一塊蛋糕。這塊蛋糕是乙個長方體,被用不同色彩分成了n個相同的小塊,每小塊都有對應的幸運值。小z作為壽星,自然希望吃到的第一塊蛋糕的幸運值總和最大,但小z最多又只能吃m小塊 m n 的蛋糕。吃東西自然就不想思考了,於是小z把這個任務扔給了學oi的你,請你幫他...