这也算是第K大问题的套路题了(虽然我一开始还想了个假算法),大体想法就是先弄出最优的一批解,然后每次从中提出一个最优解并转移到一个次优解,用优先队列维护这个过程即可。

类似的问题很多,放在序列上的,放在图上的,改天可以考虑补个专题。

#include <bits/stdc++.h>
using namespace std; #define int long long const int N = 1000005; int a[N],s[N],st[N][20],stp[N][20],n,k,L,R; int query(int l,int r)
{
int lg=log2(r-l+1);
int tmp = max(st[l][lg],st[r-(1<<lg)+1][lg]);
if(tmp==st[l][lg]) return stp[l][lg];
else return stp[r-(1<<lg)+1][lg];
} inline int eval(int o,int l,int r)
{
return s[query(l,r)]-s[o-1];
} struct Item
{
int o,l,r;
bool operator < (const Item &b) const
{
return eval(o,l,r) < eval(b.o,b.l,b.r);
}
}; Item gen(int o,int l,int r)
{
Item tmp;
tmp.o=o;
tmp.l=l;
tmp.r=r;
return tmp;
} priority_queue <Item> q;
int ans = 0; signed main()
{
cin>>n>>k>>L>>R;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
st[i][0]=s[i];
stp[i][0]=i;
}
for(int j=1;j<=19;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
{
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
if(st[i][j]==st[i][j-1])
stp[i][j]=stp[i][j-1];
else
stp[i][j]=stp[i+(1<<(j-1))][j-1];
}
for(int i=1;i+L-1<=n;i++)
{
q.push(gen(i,i+L-1,min(i+R-1,n)));
}
while(k--)
{
Item p=q.top();
q.pop();
int tans = eval(p.o,p.l,p.r);
ans += tans;
int mid = query(p.l,p.r);
if(mid!=p.l)
{
Item x=p;
x.r=mid-1;
if(x.r>=x.l) q.push(x);
}
if(mid!=p.r)
{
Item x=p;
x.l=mid+1;
if(x.r>=x.l) q.push(x);
}
}
cout<<ans<<endl;
}

[NOI2010] 超级钢琴 - 贪心,堆,ST表的更多相关文章

  1. BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)

    BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...

  2. BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表

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

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

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

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

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

  5. 【NOI2010】超级钢琴 题解(贪心+堆+ST表)

    题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力 ...

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

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

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

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

  8. bzoj2006: [NOI2010]超级钢琴(堆+RMQ)

    和上一道题同类型...都是用堆求第k大 考虑对于每一个r,怎么求出一个最优的l.显然只需要求出前缀和,用RMQ查询前面最小的l的前缀和就好了.但是对于一个r,每个l只能选一次,选了一次之后,考虑怎么把 ...

  9. 【BZOJ2006】[NOI2010] 超级钢琴(堆+RMQ)

    点此看题面 大致题意: 要你求出区间和前\(k\)大的区间的区间和之和,其中每个区间的大小在\(L\)与\(R\)之间. 堆+\(RMQ\) 这道题目,我们可以先对\(1\sim n\)中的每一个\( ...

随机推荐

  1. 小程序上拉触底&下拉加载

    data: { pageNo: 1,//当前页 pageSize: 10,//每页条数 count:'',//总条数 orderList: [], }, onLoad: function () { v ...

  2. 鼠标经过INPUT时自动获取焦点

    鼠标经过INPUT时自动获取焦点 <input type="text" name="addr" onMouseOver="this.focus( ...

  3. kubernetes安装-二进制

    主要参考https://github.com/opsnull/follow-me-install-kubernetes-cluster,采用Flanel和docker 系统信息 角色 系统 CPU C ...

  4. 基于XML的声明式事务控制

    1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  5. [Python]scatter_matrix报错 module 'pandas' has no attribute 'scatter_matrix'

    运行pandas.scatter_matrix()散点图函数时报错, 原因是该函数在新版本用法发生了变化: pandas.plotting.scatter_matrix 完整用法:pd.plottin ...

  6. 吴裕雄--天生自然 PYTHON数据分析:糖尿病视网膜病变数据分析(完整版)

    # This Python 3 environment comes with many helpful analytics libraries installed # It is defined by ...

  7. 树莓派pip安装opencv报错,Could not find a version that satisfies the requirement cv2 (from versions: )No matching distribution found for cv2

    前言 我在使用pip install opencv-python 时报错 Could not find a version that satisfies the requirement opencv ...

  8. Json与Ajax(注册实例)

    需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...

  9. Spring-Framework-官方文档阅读(一)Spring IoC Container

    通读Spring IoC容器官方文档,对IoC容器有一个大致的了解. 环境 JDK1.8 Spring Framework Version :4.3.18.RELEASE 容器概述 接口org.spr ...

  10. Spark学习之路 (十一)SparkCore的调优之Spark内存模型[转]

    概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在 ...