2006: [NOI2010]超级钢琴 - BZOJ
Description
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。 这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。 小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。
Input
第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。 接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。
Output
只有一个整数,表示乐曲美妙度的最大值。
Sample Input
4 3 2 3
3
2
-6
8
Sample Output
11
【样例说明】
共有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。
给jzp跪了,想不到竟然可以这样
首先原来有一道这样的题,就是有a,b两个有序数组,c[i,j]表示a[i]+b[i],输出前k小
这个大家都知道,用堆维护每一行的当前最小值(就是最前面的数啦),每次取一个元素,就把这一行的列+1,然后再加进堆
这个我一开始想法也差不多,先处理一个前缀和,区间[l,r]的和就变成了s[r]-s[l-1]所以也变成和上面那个差不多的东西,但是无序
所以我们还要支持查找区间k大,这样复杂度略高
于是jzp就给出了一个更好的,我们用三元组(i,l,r)表示左端点为i,右端点再[l,r]的最大值,一开始显然有n个元素
然后当我们取出元素(i,l,r)时,我们要更新,我们把它拆成两份,假设最大值在k处取得,我们就把(i,l,k-1)和(i,k+1,r)加入堆中
这样复杂度是O((n+k)log(n+k))就毫无压力了
const
maxn=;
type
node=record
i,l,r,max:longint;
end;
var
q:array[..maxn*]of node;
s:array[..maxn]of int64;
f:array[..maxn,..]of longint;
n,k,l,r,tot:longint;
ans:int64; procedure rmq;
var
i,k:longint;
begin
for i:= to n do f[i,]:=i;
k:=;
while <<k<<<=n do
begin
for i:= to n-<<k<<+ do
if s[f[i,k]]>s[f[i+<<k,k]] then f[i,k+]:=f[i,k]
else f[i,k+]:=f[i+<<k,k];
inc(k);
end;
end; function max(l,r:longint):longint;
var
k:longint;
begin
k:=;
while r-l+><<k<< do inc(k);
if s[f[r-<<k+,k]]>s[f[l,k]] then exit(f[r-<<k+,k]);
exit(f[l,k]);
end; procedure swap(var x,y:node);
var
t:node;
begin
t:=x;x:=y;y:=t;
end; procedure up(x:longint);
var
i:longint;
begin
while x> do
begin
i:=x>>;
if s[q[x].max]-s[q[x].i]> s[q[i].max]-s[q[i].i] then
begin
swap(q[i],q[x]);
x:=i;
end
else exit;
end;
end; procedure down(x:longint);
var
i:longint;
begin
i:=x<<;
while i<=tot do
begin
if (i<tot) and (s[q[i+].max]-s[q[i+].i]>s[q[i].max]-s[q[i].i]) then inc(i);
if s[q[i].max]-s[q[i].i]>s[q[x].max]-s[q[x].i] then
begin
swap(q[i],q[x]);
x:=i;i:=x<<;
end
else exit;
end;
end; procedure insert(i,l,r:longint);
begin
if r>n then r:=n;
if l>r then exit;
inc(tot);
q[tot].i:=i;q[tot].l:=l;q[tot].r:=r;
q[tot].max:=max(l,r);
up(tot);
end; procedure delete;
begin
swap(q[],q[tot]);
dec(tot);
down();
end; procedure main;
var
i:longint;
begin
read(n,k,l,r);
for i:= to n do read(s[i]);
for i:= to n do inc(s[i],s[i-]);
rmq;
for i:= to n- do insert(i,i+l,i+r);
for i:= to k do
begin
inc(ans,s[q[].max]-s[q[].i]);
insert(q[].i,q[].l,q[].max-);insert(q[].i,q[].max+,q[].r);
delete;
end;
writeln(ans);
end; begin
main;
end.
2006: [NOI2010]超级钢琴 - BZOJ的更多相关文章
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- 洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- bzoj 2006 [NOI2010]超级钢琴——ST表+堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...
- BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)
题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
随机推荐
- 兼容IE,chrome 等所有浏览器 回到顶部代码
今天在博客园看到一片帖子回到顶部代码,索性就看了下,但是发现在非IE浏览器下可以运行,在IE浏览器下却运行不了. 故将其代码搬弄过来做了些许修改后,完美支持了IE下的运行. 主要实现功能代码文件: & ...
- (转)Yale CAS + .net Client 实现 SSO(6)
第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 第五部分:扩展基于数据库的身份验证 第六 ...
- Tomcat找不到service.bat文件
说明:我们给客户做安装包,Tomcat我们设置了编码和端口,所以用绿色版的,同时又要注册成windows服务.但是bin下面没有service.bat文件(tomcat6.exe,tomcat6x.e ...
- Python深拷贝和浅拷贝
1- Python引用计数[1] 1.1 引用计数机制 引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象.内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的 ...
- 基于Httpfs访问HDFS的C++实现
Httpfs是hadoop2.x中hdfs项目的内置应用,基于tomcat和jesery,对外提供完备HDFS操作的RESTful接口,无需安装客户端,可方便实现数据交互,如从windows访问存储在 ...
- adb连接不上手机
昨天电脑重装了系统,今天打开之前的eclips工作环境,点击run as -> android application,一直报各种诡异的错误,总之就是连接不上手机. 其中包括 Adb conne ...
- 信号处理程序(signal handler)会被重置的信号
首先说明我的系统,CentOS 6.6,内核为2.6.32-504.12.2.el6.i686. 当用signal对某个信号设定信号处理函数的时候,有些信号的处理函数会被重置,有些则不会,这种情况的具 ...
- [转]Linux 分区 swap
如何合理设置Linux的swap分区 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://commandos.blog.51cto.c ...
- picLazyLoad 图片延时加载,包含背景图片
/** * picLazyLoad 图片延时加载,包含背景图片 * $(img).picLazyLoad({...}) * data-original 预加载图片地址 * alon */ ;(func ...
- NSS_11 Server Error in '/' Application
昨天手贱在Home/Index下点了下鼠标,set as start page,然后程序一直运行不起来, 一度以为mvc的route失效了, 一直报一个错误如下: