https://www.lydsy.com/JudgeOnline/problem.php?id=2006

https://www.luogu.org/problemnew/show/P2048#sub

小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。

这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。

一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。

小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。

O(n^2)很好想,肯定会T。

但事实上我们只需要区间前k大即可,所以没必要算出O(n^2)的区间和。

思考对于每个左端点l,有一个r使得[l,r]区间和最大,我们把这些值都存起来取最大就是所有区间和的最大值,然后把它弹出。

继续对于弹出的元素也可以贡献它的第二大,第三大……分别满足的r,我们依次加进去。

一种直观的想法是主席树维护,然后翻了题解开始舔st表。

事实上我们在[L,R]找到的最大值对应的r,其第二大对应的r一定是[L,r-1]和[r+1,R]最大值对应的r,用st表维护一遍即可。

(然而我菜……我根本没想到第三段话的内容TAT)

(果然人傻就该多刷题)

#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+;
const int B=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,k,L,R;
int s[N],lg[N],dp[N][B+];
struct data{
int l,r,w,L,R;
bool operator <(data b)const{
return w<b.w;
}
};
priority_queue<data>q;
inline int qpow(int a){return <<a;}
void st(){
for(int i=;i<=n;i++){
dp[i][]=i;
lg[i]=lg[i-];
if((<<lg[i]+)==i)lg[i]++;
}
for(int j=;j<=lg[n];j++){
for(int i=;i<=n;i++){
if(i+qpow(j)->n)break;
int l=dp[i][j-],r=dp[i+qpow(j-)][j-];
if(s[l]>s[r])dp[i][j]=l;
else dp[i][j]=r;
}
}
}
inline int getmax(int l,int r){
int len=r-l+,h=lg[len];
int l1=dp[l][h],r1=dp[r-qpow(h)+][h];
if(s[l1]>s[r1])return l1;
else return r1;
}
int main(){
n=read(),k=read(),L=read(),R=read();
for(int i=;i<=n;i++)s[i]=s[i-]+read();
st();
for(int i=;i+L-<=n;i++){
int j=getmax(i+L-,min(i+R-,n));
q.push((data){i,j,s[j]-s[i-],i+L-,min(i+R-,n)});
}
ll ans=;
while(k--){
data tmp=q.top();q.pop();
ans+=tmp.w;
int i=tmp.l,j=tmp.r;
if(tmp.L<=j-){
int t=getmax(tmp.L,j-);
q.push((data){i,t,s[t]-s[i-],tmp.L,j-});
}
if(j+<=tmp.R){
int t=getmax(j+,tmp.R);
q.push((data){i,t,s[t]-s[i-],j+,tmp.R});
}
}
printf("%lld\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ2006:[NOI2010]超级钢琴——题解的更多相关文章

  1. bzoj2006 [NOI2010]超级钢琴 (及其拓展)

    bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...

  2. bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴

    http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...

  3. BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MB Submit: 3446  Solved: 1692 [Submit][Sta ...

  4. [BZOJ2006][NOI2010]超级钢琴(ST表+堆)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3679  Solved: 1828[Submit][Statu ...

  5. [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 3591  Solved: 1780[Submit][Statu ...

  6. bzoj2006 noi2010 超级钢琴 主席树 + 优先队列

    Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2435  Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...

  7. BZOJ2006[NOI2010]超级钢琴——堆+主席树

    题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...

  8. 【贪心 计数】bzoj2006: [NOI2010]超级钢琴

    这么经典的贪心我怎么现在才做啊…… Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个 ...

  9. 【题解】 bzoj2006: [NOI2010]超级钢琴 (ST表+贪心)

    题面戳我 Solution 不会,看的题解 Attention 哇痛苦,一直不会打\(ST\)表,我是真的菜啊qwq 预处理 Log[1]=0;two[0]=1; for(int i=2;i<= ...

随机推荐

  1. 如何通俗理解贝叶斯推断与beta分布?

    有一枚硬币(不知道它是否公平),假如抛了三次,三次都是“花”: 能够说明它两面都是“花”吗? 1 贝叶斯推断 按照传统的算法,抛了三次得到三次“花”,那么“花”的概率应该是: 但是抛三次实在太少了,完 ...

  2. 微软职位内部推荐-Software Engineer II-Data Mining

    微软近期Open的职位: Are you looking for a big challenge? Do you know why Big Data is the next frontier for ...

  3. 5.airflow问题

    1. Traceback (most recent call last): File "/usr/bin/airflow", line 28, in <module> ...

  4. MySQL case when 使用

    case when 自定义排序时的使用 根据 case when 新的 sort字段排序 case when t2.status = 4 and t2.expire_time>UNIX_TIME ...

  5. Python Requests库简单入门

    我对Python网络爬虫的学习主要是基于中国慕课网上嵩天老师的讲授,写博客的目的是为了更好触类旁通,并且作为学习笔记之后复习回顾. 1.引言 requests 库是一个简洁且简单的处理HTTP请求的第 ...

  6. 03慕课网《进击Node.js基础(一)》API-URL网址解析

    url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...

  7. 学习调用第三方的WebService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的应用中显示,下面就以查询国内手机号码归属地为例进行说明. 首先安利一 ...

  8. Programming Protocol-Independent Packet Processors

    引言 OpenFlow协议固定的包头域数目,使得南向协议过于死板. P4可以实现自定义包头,增加灵活性. P4是OpenFlow未来发展的方向. We propose P4 as a strawman ...

  9. 字典树---2001 POJ Shortest Prefixes(找最短前缀)

    做的第一道字典树的题,算比较水的: -->>>:传送门 代码: #include <stdio.h> #include<stdlib.h> #define M ...

  10. 缓存-MemoryCache Class

    这是使用MemoryCache缓存的一个例子. private void btnGet_Click(object sender, EventArgs e) { ObjectCache cache = ...