小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。
正解:堆+貪心
解題報告:
這道題求得是序列的前k大的連續子段和的總和。我們考慮乙個問題,固定右端點,然後可以很快得到以這個端點為右端點的區間內的總和最大的區間。st表預處理一下即可。所以我們很快得到乙個思路:對於每個端點,得到以它為右端點的最優情況,用堆維護,取出前k大的值。但現在存在乙個問題:可能以某乙個端點為右端點的區間不止乙個在前k個中。既然題目要求k個不相同的區間,我們就考慮拆分一下我們上次做的區間。比如我上次的最優解是[p,i]那麼這次為了與上次取得不同,新的區間的左端點就應該在[1,p-1]、[p+1,i]中產生,右端點仍然是i。這樣做的話時間複雜度是o(k log n+n log n),可以接受。
考試的時候我擔心被卡常就寫了手寫堆,其實也不需要啦。
1//it is made by ljh2000
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
13using
namespace
std;
14 typedef long
long
ll;15
#define rg register
16const
int inf = (1
<<30
);17
const
int maxn = 500011;18
intn,k,l,r,zuo,you,a[maxn];
19ll sum[maxn],psum[maxn],ans;
20int st[maxn][20
],belong[maxn];
21int mi[20
];22
int q[maxn*4
],cnt,top;
23struct
nodejump[maxn*4
],tmp,tmp1,tmp2;
28 inline int
getint()
2934
35 inline int query(rg int l,rg int
r)40
41 inline void push(rg int
x)49}50
51 inline void
pop()62}
6364 inline void
update(rg node qq)
7071 inline void
work()
80 belong[1]=0; for(rg int i=2;i<=n;i++) belong[i]=belong[i>>1]+1;81
for(rg int i=l;i<=n;i++)
88while(k>0)
96 printf("
%lld
",ans);97}
9899
intmain()
100
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...