贪心(数据结构):COGS 468. [NOI2010]超级钢琴

★★★☆   输入文件:piano.in   输出文件:piano.out   简单对比
时间限制:2 s   内存限制:512 MB

超级钢琴

【问题描述】

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

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

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

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

【输入格式】

输入文件名为piano.in。

输入文件第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。

接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。

【输出格式】

输出文件为piano.out。

输出文件只有一个整数,表示乐曲美妙度的最大值。

【样例输入】

4 3 2 3

3

2

-6

8

【样例输出】

11


【样例说明】

共有5种不同的超级和弦:

  1. 音符1 ~ 2,美妙度为3 + 2 = 5
  2. 音符2 ~ 3,美妙度为2 + (-6) = -4
  3. 音符3 ~ 4,美妙度为(-6) + 8 = 2
  4. 音符1 ~ 3,美妙度为3 + 2 + (-6) = -1
  5. 音符2 ~ 4,美妙度为2 + (-6) + 8 = 4

最优方案为:乐曲由和弦1,和弦3,和弦5组成,美妙度为5 + 2 + 4 = 11。

【数据规模和约定】

总共10个测试点,数据范围满足:

所有数据满足:-1000 ≤ Ai ≤ 1000,1 ≤ L ≤ R ≤ n且保证一定存在满足要求的乐曲。

  

  这题考虑贪心,用一个三元组记录node为起点,能取到的右端点区间。

  用ST可以O(1)求出区间中应取哪一个右端点,每次取最大的,处理成两个子区间,放回heap中,继续贪心。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 using namespace std;
  5 const int maxn=500010;
  6 int n,K,L,R,s[maxn],pos;
  7 struct Node{
  8     int node,l,r;
  9     Node(int NODE=0,int L=0,int R=0){
 10         node=NODE;l=L;r=R;
 11     }
 12 };
 13 int mm[maxn],Max[maxn][25],Mpos[maxn][25];
 14 
 15 int Query(int l,int r){
 16     if(Max[l][mm[r-l+1]]<Max[r-(1<<mm[r-l+1])+1][mm[r-l+1]]){
 17         pos=Mpos[r-(1<<mm[r-l+1])+1][mm[r-l+1]];
 18         return Max[r-(1<<mm[r-l+1])+1][mm[r-l+1]];
 19     }
 20     else{
 21         pos=Mpos[l][mm[r-l+1]];
 22         return Max[l][mm[r-l+1]];
 23     }
 24 }
 25 
 26 int Q(Node x){
 27     return Query(x.l,x.r)-s[x.node-1];
 28 }
 29 
 30 struct Heap{
 31     int cnt;
 32     Node h[maxn<<1];
 33     void Insert(Node x){
 34         int p=++cnt;
 35         while(p!=1){
 36             if(Q(x)<=Q(h[p>>1]))break;
 37             h[p]=h[p>>1];
 38             p>>=1;
 39         }
 40         h[p]=x;
 41     } 
 42     
 43     void Delete(){
 44         int p=1,a,b;
 45         Node x=h[cnt--];
 46         while(p*2<=cnt){
 47             a=p<<1;b=a|1;
 48             if(b<=cnt&&Q(h[a])<Q(h[b]))a=b;
 49             if(Q(h[a])<=Q(x))break;
 50             h[p]=h[a];
 51             p=a;    
 52         }
 53         h[p]=x;
 54     }
 55 }q;
 56 
 57 int main(){
 58     freopen("piano.in","r",stdin);
 59     freopen("piano.out","w",stdout);
 60     scanf("%d%d%d%d",&n,&K,&L,&R);
 61     
 62     for(int i=1;i<=n;i++)
 63         scanf("%d",&s[i]);    
 64     for(int i=1;i<=n;i++)
 65         s[i]+=s[i-1];
 66     
 67     mm[0]=-1;
 68     for(int i=1;i<=n;i++){
 69         mm[i]=(i&(i-1))==0?mm[i-1]+1:mm[i-1];
 70         Max[i][0]=s[i];
 71         Mpos[i][0]=i;
 72     }
 73     
 74     for(int k=1;k<=mm[n];k++)
 75         for(int i=1;i+(1<<k)-1<=n;i++){
 76             if(Max[i][k-1]>Max[i+(1<<(k-1))][k-1]){
 77                 Max[i][k]=Max[i][k-1];
 78                 Mpos[i][k]=Mpos[i][k-1];
 79             }
 80             else{
 81                 Max[i][k]=Max[i+(1<<(k-1))][k-1];
 82                 Mpos[i][k]=Mpos[i+(1<<(k-1))][k-1];
 83             }
 84         }
 85     
 86     for(int i=1;i<=n-L+1;i++)
 87         q.Insert(Node(i,i+L-1,min(i+R-1,n)));
 88     
 89     long long ans=0;
 90     int p;
 91     Node x;
 92     while(K--){
 93         ans+=Q(q.h[1]);
 94         x=q.h[1];p=pos;
 95         q.Delete();
 96         
 97         if(x.l<p)q.Insert(Node(x.node,x.l,p-1));
 98         if(x.r>p)q.Insert(Node(x.node,p+1,x.r));
 99     }
100     printf("%lld\n",ans);
101     return 0;
102 }

 

转载于:https://www.cnblogs.com/TenderRun/p/5316913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现选择排序 带打印,选择排序算法的JAVA实现

选择排序算法的JAVA实现package Utils.Sort;/***利用选择排序法对数组排序&#xff0c;数组中元素必须实现了Comparable接口。*/public class ChooseSort implements SortStrategy{/***对数组obj中的元素以选择排序算法进行排序*/public void sort(Comparable[] obj){if (obj …

angularjs初始化时不显示模板内容, 不显示html, 不显示template

template的内容可能在需要的数据准备好之前就显示出来了, ng-cloak可以解决这个问题 ng-cloak <div id"template1" ng-cloak>{{ hello }}</div> <div id"template2" class"ng-cloak">{{ world }}</div>

左右箭头滑动列表

//slideshow 左右箭头滑动一组li焦点图 autoSlide();function autoSlide(){clearAutoSsetInterval(autoFunS,5000);}function autoFunS(){var loc$(".slideshow-box ul").css("left");if(loc"-2370px"){loc"1185";}var newlocparseInt…

20159206《网络攻防实践》第四周学习总结

20159206《网络攻防实践》第四周学习总结 教材学习内容总结 本章主要介绍了网络嗅探和协议分析 网络嗅探是一种常用的窃听技术&#xff0c;利用计算机的网络接口截获目的地为其他计算机的数据报文&#xff0c;以监听数据流中所包含的用户账户密码或私密信息等。 网络泄滩具有很…

四六级php,详解四六级查询API+网页

这个API是第三方API&#xff0c;第三方API的工作原理大都基于此&#xff0c;本文主要起一反三之作用&#xff0c;代码的不处周之还望及时指出。开发环境&#xff1a;WinServer2012 php7.0 Apache2.4.8思路&#xff1a;向官方查询界面传递参数&#xff0c;使用curl抓取结果网页…

终于把joomla 的 protostar 模版的菜单,从垂直改到水平了

protostar-applying-menu-class-suffixes-horizontal-vs-vertical-menus.html joomla 3.7.5 附带的这个template , 菜单丑的要死。 估计是新改的。 看网上的其他站点都没这毛病。 最后终于找到解决方法了。“ nav-pills“ 前面是有空格的 To make the menu horizonal, you can …

Find non-overlap jobs with max cost

Given a set of n jobs with [start time, end time, cost] find a subset so that no 2 jobs overlap and the cost is maximum.Job: &#xff08;start_time, end_time] --- cost 如果只是求maxCost, 一维就可以做。 但是如果要知道有选了哪些job&#xff0c;则需要存成二维。…

php 跨区域,PHP跨时区的功能实现

现在有一个跨时区的应用&#xff0c;不同时区登录的用户需要看到自己时区的时间&#xff0c;同时也要能够进行时区的切换。我的思路是&#xff0c;系统中所有存储的时间都是GMT(UTC)时间&#xff0c;用户登录时&#xff0c;根据用户所在的时区进行对应的显示。首先了解一下PHP中…

js实现向上滚动效果

源码&#xff1a;<style type"text/css"> #up_zzjs{border:1px solid #ccc;width:170px;height:182px;line-height:20px;overflow:hidden;} #up_zzjs #up_li{list-style-type:none;margin:0;padding:0;margin-left:6px;} /*系统支持ie8就选line-heigh…

利用数据的商业智能分析工具

商业智能可以定义为获取和转换原始数据的技术和工具&#xff0c;这些信息可以为业务运营提供有意义的好处。 商业智能的发展 商业智能&#xff08;BI&#xff09;是一个可追溯到19世纪中期的术语&#xff0c;基本上是一样的定义。但作为结构化数据的自动化处理的参考&#xff0…

管理之道(三) - 不要吝惜赞美

多一句赞美 人们相互希望得越多&#xff0c;想要给予对方的越多……就必定越亲密。   几天前&#xff0c;我和一位朋友在纽约搭计程车&#xff0c;下车时&#xff0c;朋友对司机说&#xff1a;“谢谢&#xff0c;搭你的车十分舒适。”这司机听了愣了一愣&#xff0c;然后说&a…

优酷视频整段代理php,thinkphp仿优酷带数据源码|php仿优酷视频源码带后台功能强大...

本项目是仿优酷官网&#xff0c;优酷官网是一个集多种知识面为一体的网站&#xff0c;能全面的锻炼我们的技能,所以我们决定仿优酷网。本项目后台主要实现了&#xff1a;用户管理、分类管理、视频管理、评论管理、权限管理、轮播管理、网站配置和广告管理以及登录退出等模块。前…

Centos7安装Oracle JDK

查看Linux是否自带的JDK&#xff0c;如有openJDK&#xff0c;则卸载1 java -version 1 rpm -qa | grep -E ^open[jre|jdk]|j[re|dk] 卸载openjdk1 su root 2 3 yum -y remove java java-1.7.0-openjdk 下载oracle jdk1 wget --no-cookies --header "Cookie: oraclelice…

前端每周清单第 30 期:WebVR 指南,Vue 代码分割范式,理想的 React 架构特性

前端每周清单专注前端领域内容&#xff0c;以对外文资料的搜集为主&#xff0c;帮助开发者了解一周前端热点&#xff1b;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关注【前端之巅】微信公众号&#xff08;ID&#xff1a;frontshow&#xff…

Oracle(3)——Oracle图形界面工具创建数据库

具体操作步骤详情&#xff1a; 1.图形界面工具首界面 Database Configuration Assistant 点击下一步 2.默认 点击下一步 3.默认 点击下一步 4.设置全局数据库名、SID 为新建数据库起一个“全局数据库名”&#xff0c;比如这里对数据库名和SID&#xff1a;FKXT 点击下一步 5.设置…

rsa 加密 js php,security.js+RSA做出加密功能

这次给大家带来security.jsRSA做出加密功能&#xff0c;的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。在项目中遇到要对用户输入的密码进行RSA加密的需求&#xff0c;总结一下实现过程&#xff1a;JS rsa加密加密//引入security.js文件var btn doc…

多线程面试题系列(12):多线程同步内功心法——PV操作上

上面的文章讲解了在Windows系统下实现多线程同步互斥的方法&#xff0c;为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力&#xff0c;接下来将讲解PV操作&#xff0c;这也是操作系统中的重点和难点。本文将会先简要介绍下PV操作的来源和基本使用方法&#xff0c…

两离散序列卷积matlab,离散序列卷积和(用matlab实现)

数字信号处理实验报告实验一离散时间序列卷积和MATLAB实现(一)实验目的&#xff1a;学会用MATLAB对信号与系统分析的方法&#xff0c;理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。(二)实验原理&#xff1a;1、离散时间序列f1(k)和f2(k)的卷积和定义&#xff1a…

linux命令学习-4-lsof

lsof&#xff08;list open files&#xff09;是一个列出当前系统打开文件的工具。在linux环境下&#xff0c;任何事物都以文件的形式存在&#xff0c;通过文件不仅仅可以访问常规数据&#xff0c;还可以访问网络连接和硬件。 在终端下输入lsof即可显示系统打开的文件&#xff…

IOS6+ 下,使用position:sticky实现粘性布局

回顾一下 开通博客之后&#xff0c;潦草的写了几篇&#xff0c;之后由于没时间&#xff0c;加上文笔不好等等&#xff08;好吧&#xff0c;都是借口&#xff09;&#xff0c;基本上就没怎么写过了&#xff0c;其实平时也做了一些记录&#xff0c;但就是犯懒&#xff0c;没有去整…