2018.12.28-bzoj-2006-[NOI2010]超级钢琴

news/2024/7/3 21:25:03

题目描述:

小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的
音乐。 这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。 一个“超级
和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的
所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。 
小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。
我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最
大值是多少

算法标签:st表

思路:

对于以每个节点为左节点的区间,用st表求出最优的右区间,用优先队列维护,每次取出队首的同时,把区间以上一次最优点为分界分成两半继续进队列。

以下代码:

#include<bits/stdc++.h>
#define il inline
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
const int N=5e5+5;
struct node{int x,l,r,pos,v;friend bool operator<(node t1,node t2) {return t1.v<t2.v;}};
int n,k,L,R,sum[N],mx[N][20],Log[N];long long ans;priority_queue<node> q;
il int read(){int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;}
il int Max(int x,int y){return sum[x]<sum[y]?y:x;}
il int query(int l,int r){int k=Log[r-l+1];return Max(mx[l][k],mx[r-(1<<k)+1][k]);}
int main()
{
    n=read();k=read();L=read();R=read();
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+read(),mx[i][0]=i;
    for(int i=2;i<=n;i++)Log[i]=Log[i>>1]+1;
    for(int j=1;j<=Log[n];j++)for(int i=1;i+(1<<j-1)<=n;i++)
        mx[i][j]=Max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
    for(int i=1;i+L-1<=n;i++){
        int pos=query(i+L-1,min(i+R-1,n));q.push((node){i,i+L-1,min(i+R-1,n),pos,sum[pos]-sum[i-1]});
    }
    while(k--){
        node now=q.top();q.pop();ans+=now.v;int p;
        if(now.l<now.pos)p=query(now.l,now.pos-1),q.push((node){now.x,now.l,now.pos-1,p,sum[p]-sum[now.x-1]});
        if(now.pos<now.r)p=query(now.pos+1,now.r),q.push((node){now.x,now.pos+1,now.r,p,sum[p]-sum[now.x-1]});
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Jessie-/p/10193653.html


http://www.niftyadmin.cn/n/2574516.html

相关文章

【C++】 45_不同的继承方式

被忽略的细节&#xff1a;冒号 ( : ) 表示继承关系&#xff0c;Parent 表示被继承的类&#xff0c; public 的意义是什么呢&#xff1f; class Parent { };class Child : public Parent { }; 有趣的问题 是否可以将继承语句中的 public 换成 protected 或者 private &#xff1…

使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

0、preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apache website: https://repository.apache.org/content/repositories/releases/org/apache/mrunit/mrunit/. For example if you are using the Hadoop version 1.0.…

Powershell管理系列(十四)Exchange 2013邮箱数量统计

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包&#xff0c;QQ:185426445.电话18666943750管理Exchange的话&#xff0c;我们首先对自己管理的邮箱数量和分布情况有所了解。打开EAC我们确实很快就可以查到有多少邮箱数量&#xff0c;如果邮箱比较多的话…

还在找MCM模板?其实都内置了!用法见下

TeX live 2015及更新版本 和 MiKTeX &#xff08;以默认选项安装&#xff09;均内置了由Liam Huang维护的mcmthesis模板&#xff08;文档类&#xff09; 已被CTAN收录&#xff0c;可以说是全球认可的MCM模板了 所以&#xff0c;小伙伴们不要在找模板了&#xff0c;这个最好用 但…

LeetCode刷题 fIRST MISSING POSITIVE

Given an unsorted integer array,find missing postive integer. For example , Given [1,2,0]return 3, and [3,4,-1,1]return 2. Your algorithm should run in O(n) time and users constant space. 分析如下&#xff1a; 首先&#xff0c;要理解题解&#xff1a; 如果输入…

数据结构与算法--克鲁斯卡尔算法 最小生成树 Python详细实现克鲁斯卡尔算法 Python详细实现最小生成树

阅读目录基本概述克鲁斯卡尔算法图解克鲁斯卡尔算法分析Python代码实现补充知识点&#xff1a;如何获取int&#xff08;long&#xff09;和 float 的最值完整代码实现基本概述 先看一个应用场景&#xff1a; 克鲁斯卡尔算法介绍&#xff1a; 克鲁斯卡尔算法图解 还是以上面的…

应用 JD-Eclipse 插件实现 RFT 中 .class 文件的反向编译

概述 反编译是一个将目标代码转换成源代码的过程。而目标代码是一种用语言表示的代码 , 这种语言能通过实机或虚拟机直接执行。文本所要介绍的 JD-Eclipse 是一款反编译的开源软件&#xff0c;它是应用于 Eclipse 开发平台的插件&#xff0c;它可以帮助开发人员在调试程序的过程…

C语言作业小学生的算术题,C语言大型作业-教小学生算数.doc

..《C语言工程训练》课程设计题目&#xff1a; 教小学生算数学 生 学 号 &#xff1a;学 生 姓 名 &#xff1a;指 导 教 师 &#xff1a;需求分析通过此系统实现以下功能做个位数&#xff0c;十位数的加&#xff0c;减&#xff0c;乘和除&#xff0c;减法不能得负数&#xff0…