題面
今天是小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 usingview codenamespace
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
<
}
②st稀疏表
#include usingview codenamespace
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
<
}
洛谷 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的你,請你幫他...