bzoj2006: [noi2010]超級鋼琴
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的**。
這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。
乙個「超級和弦」由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。
我們定義超級和弦的美妙度為其包含的所有音符的美妙度之和。兩個超級和弦被認為是相同的,當且僅當這兩個超級和弦所包含的音符集合是相同的。
小z決定創作一首由k個超級和弦組成的樂曲,為了使得樂曲更加動聽,小z要求該樂曲由k個不同的超級和弦組成。
我們定義一首樂曲的美妙度為其所包含的所有超級和弦的美妙度之和。
小z想知道他能夠創作出來的樂曲美妙度最大值是多少。
第一行包含四個正整數n, k, l, r。其中n為音符的個數,k為樂曲所包含的超級和弦個數,l和r分別是超級和弦所包含音符個數的下限和上限。
接下來n行,每行包含乙個整數ai,表示按編號從小到大每個音符的美妙度。
n<=500,000, k<=500,000 ,-1000<=ai<=1000,1<=l<=r<=n且保證一定存在滿足條件的樂曲
只有乙個整數,表示樂曲美妙度的最大值。
4 3 2 332
-6811【樣例說明】
共有5種不同的超級和弦:
音符1 ~ 2,美妙度為3 + 2 = 5
音符2 ~ 3,美妙度為2 + (-6) = -4
音符3 ~ 4,美妙度為(-6) + 8 = 2
音符1 ~ 3,美妙度為3 + 2 + (-6) = -1
音符2 ~ 4,美妙度為2 + (-6) + 8 = 4
最優方案為:樂曲由和弦1,和弦3,和弦5組成,美妙度為5 + 2 + 4 = 11。
題目大意:
有$n$個音符$a_1,a_2,a_3,...a_n$。
要求找到$k$段超級和弦組成的樂曲,每段連續的音符的個數$x$滿足$l\leq x\leq r$,求樂曲美妙度的最大值。
首先可以看到,每段超級和弦都是連續的,美妙度是這段區間內所有美妙度的和。
可以想到,每次求解區間和顯然是不合算的,所以考慮到用字首和。
考慮暴力,我們需要把所有滿足條件的字段抽出來排個序,但這實在是不可想象。
所以考慮使用貪心思想來解決這個問題。
首先,我們定義$f(s,l,r)=\max \$,即以$s$為左端點,右端點範圍是$[l,r]$的最大子段和,$sum$是字首和。
可以看出,$s$的位置是固定的。
所以$sum(s-1)$也是固定的。
所以我們要求這個的最大值,只要$sum(t)$最大就可以了。
即要求$sum(t)$在$t\in [l,r]$時的最大值。
這個最大值的求解就丟給了$rmq$。。。
當然,具體計算的時候還要看看上界$r$是否超過了$n$。
接下來想怎麼貪心。
我們可以每次都選最優的子段,這樣選$k$次顯然就是我們所要的結果。
那怎麼找到最優解呢?
用堆來將解存進去,每次堆頂的元素就是最優解。
考慮乙個三元組$(s,l,r)$表示以$s$為左端點,右端點的選擇區間為$[l, r]$的情況。
我們假設當前最大的三元組是$(s,l,r)$,最優解位置是$t$。
由於$t$已經被選中,對於這個$s$,$t$已經不能重複選中,但最優解還可能存在於$t$左右的兩端區間中。
所以提取出$(s,l,r)$之後,為了避免重複且不喪失其他較優解,我們仍然要把$(s,l,t-1),(o,t+1,r)$扔回堆裡面去。
顯然地,在放回去之前應該保證區間的存在,即$l=t$或$r=t$的情況要進行特判。
由此,我們查詢區間最大值的時候查詢的是最優解的位置。
然後就沒有然後了。。。
附**:
#include#include#include#include#include#define maxn 500010using namespace std;
int n,m,l,r,f[maxn][20];
long long sum[maxn];
struct node
while(c>='0'&&c<='9')
return date*w;
}void step()
}inline int query(int l,int r)
void work()
if(u.r!=u.t)
} printf("%lld\n",ans);
}void init()
step();
for(int i=1;i<=n;i++)if(i+l-1<=n)q.push((node));
}int main()
bzoj 2006 NOI2010 超級鋼琴
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為...
BZOJ 2006 NOI2010 超級鋼琴
orz zzk 最直接的想法是找出所有不同的長度在 l,r 的子段然後選最大的k個加到答案中 但是太暴力沒前途啊 zzk教會我 首先構造字首和陣列pre 定義乙個三元組max i,l,r 表示以i為右端點且左端點在 l,r 之間的使pre i pre t 1 最大的值 等價於 l,r 中使pre t...
BZOJ 2006 NOI2010 超級鋼琴
time limit 20 sec memory limit 552 mb submit 3254 solved 1604 小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai...