题意:

思路:

用三元组(i, l, r)表示右端点为i,左端点在[l, r]之间和最大的区间([l, r]保证是对于i可行右端点区间的一个子区间),我们用堆维护一些这样的三元组。

堆中初始的元素为每个i,并且[l, r]为这个i可行左端点的区间。

假如某次最大值为(i, l, r),并且j为那个和最大区间的左端点,那么需要往堆中加入两个三元组(i, l, j-1)和(i, j+1, r)。

对于一个三元组,计算对应最大和的问题实际就是一个RMQ问题,可以通过Sparse Table在O(NlogN) – O(1)的时间内解决。

实际上固定左端点的方法也类似,程序中使用这种方法

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#define mp(a,b,c,d) (data){a,b,c,d}
#define inf 1000000000
#define ll long long
#define MAXN 510000
using namespace std;
struct data{int i,l,r,t;}; int f[MAXN][];
int a[MAXN]; int query(int x,int y)
{
if(x>y) return ;
int len=y-x+; int l=log(len)/log();
int s1=f[x][l];
int s2=f[y-(<<l)+][l];
if(a[s1]>a[s2]) return s1;
else return s2;
} bool operator<(data x,data y)
{
return a[x.t]-a[x.i-]<a[y.t]-a[y.i-];
} int main()
{
freopen("bzoj2006.in","r",stdin);
freopen("bzoj2006.out","w",stdout);
priority_queue<data,vector<data> >q;
int n,K,L,R;
scanf("%d%d%d%d",&n,&K,&L,&R);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]+=a[i-];
f[i][]=i;
}
int l=log(n)/log();
for(int i=;i<=l;i++)
for(int j=;j+(<<i)-<=n;j++)
{
int x=f[j][i-]; int y=f[j+(<<(i-))][i-];
if(a[x]>a[y]) f[j][i]=x;
else f[j][i]=y;
}
for(int i=;i<=n;i++)
if(i+L-<=n)
{
int t=min(n,i+R-);
q.push(mp(i,i+L-,t,query(i+L-,t)));
}
ll ans=;
for(int i=;i<=K;i++)
{
data t=q.top();q.pop();
ans+=a[t.t]-a[t.i-];
//printf("%lld\n",ans);
if(t.t->=t.l) q.push(mp(t.i,t.l,t.t-,query(t.l,t.t-)));
if(t.t+<=t.r) q.push(mp(t.i,t.t+,t.r,query(t.t+,t.r)));
}
printf("%lld\n",ans);
return ;
}

【BZOJ2006】超级钢琴(RMQ,priority_queue)的更多相关文章

  1. BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )

    取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...

  2. 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]

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

  3. P2048 [NOI2010]超级钢琴 (RMQ,堆)

    大意: 给定n元素序列a, 定义一个区间的权值为区间内所有元素和, 求前k大的长度在[L,R]范围内的区间的权值和. 固定右端点, 转为查询左端点最小的前缀和, 可以用RMQ O(1)查询. 要求的是 ...

  4. [NOI2010][bzoj2006] 超级钢琴 [主席树/ST表+堆]

    题面: 传送门 思路: 首先容易想到用堆维护的O(n2logn)暴力 那么肯定就是在这个基础上套数据结构了[愉快] 然而我因为过于蒟蒻......只想得到主席树暴力***过去的方法 大概就是把前缀和算 ...

  5. BZOJ2006 超级钢琴

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

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

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

  7. 【bzoj2006】[NOI2010]超级钢琴 倍增RMQ+STL-堆

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

  8. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

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

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

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

随机推荐

  1. CF962E Byteland, Berland and Disputed Cities

    思路: http://codeforces.com/blog/entry/58869. 实现: #include <bits/stdc++.h> using namespace std; ...

  2. Eigen3的安装

  3. idea 下maven 导入本地jar,以及导入之后 java不能引用问题

    1.在当前的项目中新建立一个lib文件夹,将需要导入的jar放入其中. 2.配置pom.xml 文件 <!--导入本地jar--> <dependency> <group ...

  4. droplang - 删除一种 PostgreSQL 过程语言

    SYNOPSIS droplang [ connection-option...] langname [ dbname] droplang [ connection-option...] --list ...

  5. QT+UI界面初识+界面与编辑区结合操作

    图片中时UI界面的初识,了解界面部件都是干啥的: 有了界面之后,使得QT的开发变的更加的便捷,但是在ui界面有时满足不了的功能,就需要使用代码解决,怎么利用代码呢? 首先:打开程序编辑区: #incl ...

  6. python⽤户登陆

    ⽤户登陆(三次输错机会)且每次输错误时显示剩余错误次数(提示:使⽤字符串格式化) count = 3 while count < 4: count -= 1 username = input(' ...

  7. ubuntu install zabbix

    ubuntu install zabbix reference1 reference2 some ERRORS raise during install process, may it help. z ...

  8. POJ-1011(sticks,深搜)

    Description George took sticks of the same length and cut them randomly until all parts became at mo ...

  9. scanf_s获取参数,清空缓冲区,判断是否读取成功

    #include<stdio.h> int main() { ]; ) { printf("Please input:\n"); ); ) { printf(" ...

  10. SDOI2011 拦截导弹

    题目描述 题解: 对于第一问,我们求二维LIS即可; 对于第二问,我们可以记录向前最长长度,向前最长方案数,向后最长长度,向后最长方案数. 其实改改树状数组即可. 还有,方案数一定要开double. ...