论将区间和转化为前缀和的重要性
这题一旦转化为前缀和就非常明了了
一段区间[l,r]的美妙程度就等于s[r]-s[l-1]
对于这种无法计算出所有方案而取前k大的题目,我们一般分类别然后利用类别内的单调性用堆维护
对于以i开头的区间,显然最美的长度在[l,r]之间的区间和
显然是max(s[i+l-1~i+r-1]),设这个最美的为k
次美的就是max(max(s[i+l-1~k-1]),max(s[k+1~i+r-1]),以此类推
不难想到用ST预处理区间前缀最大值
然后用大根堆维护开头为i,末端点位置在[p,q]上的最大值,
每次取出当前堆最大值,设在k取到最大值,就将这个区间裂位[p,k-1],[k+1,q]两个区间加入堆
一共进行k次,总的复杂度大约是O(klogn+nlogn)
讲的可能不是很清楚,具体见程序吧

 type node=record
tl,tr,st,loc:longint;
num:int64;
end; var heap:array[..] of node;
d:array[..] of longint;
f:array[..,..] of longint;
s:array[..] of longint;
n,k,l,r,i,j,x,y,t,p:longint;
ans:int64; function max(a,b:longint):longint;
begin
if s[a]>s[b] then exit(a) else exit(b);
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function ask(x,y:longint):longint;
var k:longint;
begin
k:=trunc(ln(y-x+)/ln());
exit(max(f[x,k],f[y-d[k]+,k]));
end; procedure insert(i,x,y:longint);
begin
heap[t].tl:=x;
heap[t].tr:=y;
heap[t].st:=i;
heap[t].loc:=ask(x,y);
heap[t].num:=s[heap[t].loc]-s[i-];
end; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; procedure up(i:longint);
var j:longint;
begin
j:=i shr ;
while j> do
begin
if heap[i].num>heap[j].num then
begin
swap(heap[i],heap[j]);
i:=j;
j:=i shr ;
end
else break;
end;
end; procedure sift(i:longint);
var j:longint;
begin
j:=i shl ;
while j<=t do
begin
if (j<t) and (heap[j].num<heap[j+].num) then inc(j);
if heap[i].num<heap[j].num then
begin
swap(heap[i],heap[j]);
i:=j;
j:=i shl ;
end
else break;
end;
end; begin
readln(n,k,l,r);
for i:= to n do
begin
readln(x);
s[i]:=s[i-]+x;
f[i,]:=i;
end;
t:=trunc(ln(n)/ln());
d[]:=;
for i:= to t do
d[i]:=d[i-]*;
for j:= to t do
for i:= to n do
if i+d[j]-<=n then
f[i,j]:=max(f[i,j-],f[i+d[j-],j-])
else break;
t:=;
for i:= to n-l+ do
begin
inc(t);
insert(i,i+l-,min(i+r-,n));
up(i);
end;
for i:= to k do
begin
p:=heap[].loc;
x:=heap[].tl;
y:=heap[].tr;
j:=heap[].st;
ans:=ans+int64(heap[].num);
swap(heap[],heap[t]);
dec(t);
sift();
if p>x then
begin
inc(t);
insert(j,x,p-);
up(t);
end;
if p<y then
begin
inc(t);
insert(j,p+,y);
up(t);
end;
end;
writeln(ans);
end.

bzoj2006的更多相关文章

  1. 【bzoj2006】 NOI2010—超级钢琴

    http://www.lydsy.com/JudgeOnline/problem.php?id=2006 (题目链接) 题意 给出一个数列,在其中选出K个长度在${[L,R]}$之间的不同的区间,使得 ...

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

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

  3. 【BZOJ2006】超级钢琴(主席树,优先队列)

    [BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一 ...

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

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

  5. 【BZOJ2006】【NOI2010】超级钢琴(主席树,优先队列)

    [BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一 ...

  6. 【bzoj2006】超级钢琴

    Portal --> bzoj2006 Solution 一开始看错题了..没有看到编号连续然后愣了好久== ​ 首先肯定是找最大的\(K\)个啦,然后具体怎么找的话..没有什么特别好的办法那就 ...

  7. 【BZOJ2006】[NOI2010]超级钢琴 ST表+堆

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

  8. 【BZOJ2006】超级钢琴(RMQ,priority_queue)

    题意: 思路: 用三元组(i, l, r)表示右端点为i,左端点在[l, r]之间和最大的区间([l, r]保证是对于i可行右端点区间的一个子区间),我们用堆维护一些这样的三元组. 堆中初始的元素为每 ...

  9. BZOJ2006 超级钢琴

    Description ​ 给定一个长度为n的区间,询问前k大的区间和,区间长度\(\in [L, R]\). $ n, k <= 500000$ Solution ​ 首先求前缀和.把一个区间 ...

  10. BZOJ2006——[NOI2010]超级钢琴

    1.题意:给一个序列,让你取出k个不同的区间,要求长度在之间,问所有区间和的最大值 2.分析:这道题拿过来就能知道是要拿出前k个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前 ...

随机推荐

  1. android反编译经验谈

    反编译这事,找对了工具其实非常简单. 反编译工具下载地址http://pan.baidu.com/s/1eQvshwu android的反编译要经过两个步骤: 1.把dex文件转为jar 2.jar转 ...

  2. 9.28noip模拟试题

    1.栅栏迷宫 田野上搭建了一个黄金大神专用的栅栏围成的迷宫.幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫 ...

  3. android 利用隐式Intent打开图片

    实现功能   点击"查看图片"时能够跳出提示,选择系统图库打开还是自己编写的应用打开,并且对于下载好的图片也有效. 1.我将 qiaoba.jpg 放在 res/drawable  ...

  4. tomcat的webapp下的root文件夹的作用是什么

    1.基本一样..只是表示不同的tomcat的http路径而已. root目录默认放的是tomcat自己的一个项目,如:http://localhost:8080/默认访问root项目 对于webapp ...

  5. MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题

    在安装MySQL 5.6.30时,安装完成后,后台日志报如下警告信息:2016-05-27 12:25:27 7fabf86f7700 InnoDB: Error: Table "mysql ...

  6. OC - 27.CATransition

    概述 简介 CATransition又称转场动画,是CAAnimation的子类,可以直接使用 转场动画主要用于为图层提供移入/移出屏幕的动画效果 转场动画常见的应用是UINavigationCont ...

  7. Composite 模式的实现

    实现要点: 1.组合模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器. 2 ...

  8. SGU 172.eXam(二分图染色)

    时间限制:0.25s 空间限制:4M 题意: 将n(n<200)个点分成两个集合,给出m(m<=30000)对不能在一个集合的点对,判断能否分成满足要求的集合,输出其中一个集合和集合的总数 ...

  9. poj 1087.A Plug for UNIX (最大流)

    网络流,关键在建图 建图思路在代码里 /* 最大流SAP 邻接表 思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧. 优化: 1.当前弧优化(重要). 1.每找到以条增广路回退到断点(常数优化 ...

  10. paramiko SSH 模块简单应用。

    目的:需要ssh链接到Linux主机,执行telnet 命令,抓回显匹配制定内容. ssh --->执行telnet到本地端口--->执行类似 ls 的命令.匹配命令执行后的特定回显字段. ...