[NOI2010] 超级钢琴 - 贪心,堆,ST表
这也算是第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表的更多相关文章
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- 【NOI2010】超级钢琴 题解(贪心+堆+ST表)
题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力 ...
- [NOI2010][bzoj2006] 超级钢琴 [主席树/ST表+堆]
题面: 传送门 思路: 首先容易想到用堆维护的O(n2logn)暴力 那么肯定就是在这个基础上套数据结构了[愉快] 然而我因为过于蒟蒻......只想得到主席树暴力***过去的方法 大概就是把前缀和算 ...
- P2048 [NOI2010]超级钢琴 (RMQ,堆)
大意: 给定n元素序列a, 定义一个区间的权值为区间内所有元素和, 求前k大的长度在[L,R]范围内的区间的权值和. 固定右端点, 转为查询左端点最小的前缀和, 可以用RMQ O(1)查询. 要求的是 ...
- bzoj2006: [NOI2010]超级钢琴(堆+RMQ)
和上一道题同类型...都是用堆求第k大 考虑对于每一个r,怎么求出一个最优的l.显然只需要求出前缀和,用RMQ查询前面最小的l的前缀和就好了.但是对于一个r,每个l只能选一次,选了一次之后,考虑怎么把 ...
- 【BZOJ2006】[NOI2010] 超级钢琴(堆+RMQ)
点此看题面 大致题意: 要你求出区间和前\(k\)大的区间的区间和之和,其中每个区间的大小在\(L\)与\(R\)之间. 堆+\(RMQ\) 这道题目,我们可以先对\(1\sim n\)中的每一个\( ...
随机推荐
- 数据结构(集合)学习之Map(二)
集合 框架关系图 补充:HashTable父类是Dictionary,不是AbstractMap. 一:HashMap中的链循环: 一般来说HashMap中的链循环会发生在多线程操作时(虽然HashM ...
- Window Api 通过账号密码访问共享文件夹
using System; using System.Runtime.InteropServices; namespace PushGCodeService { public class Shared ...
- CSS相对定位与绝对定位
1.相对定位 Position : relative ; 特点: 1 如果没有定位偏移量,对元素本身没有任何影响: 2 不使元素脱离文档流,空间是会被保留: 3 不影响其他元素布局: 4 left.t ...
- Uva1213(线性筛模板+dp)
题意: 把n拆成k个不同素数的和,有多少种拆法. 解法: 打表后dp即可,这个dp的问题可以归纳为:在n个数中选k个数,使得和m的方案数 #include<cstdio> #include ...
- .NET/C# 万能 HTTP 模拟请求框架
我是一名 ASP.NET 程序员,专注于 B/S 项目开发.累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html HttpHelper ...
- claim、claimsidentity、claimsprincipal
Claim表示一个声明单元,它用来组成ClaimsIdentity.ClaimsIdentity表示一个证件,例如身份证,身份证上面的名字表示一个Claim,身份证号也表示一个Claim,所有这些Cl ...
- PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output e ...
- Python-Django学习笔记(四)-views的编写以及urls分发器的配置
MTV中的V表示的是Views,视图函数(或简称视图)只是一个Python函数,它接受Web请求并返回Web响应. 通俗的理解可以理解为后端控制器. (响应可以是网页的HTML内容,重定向,404错误 ...
- 双 leave 栈迁移的坑
目录 简介 问题 解决办法 简介 之前在复现自己做出来的题时,一样的思路发现拿不了 shell 了,后来发现是栈迁移的坑. 问题 假设 32 位系统中,漏洞函数可以任意写入 0x0000000 ...
- 全网VIP视频解析接口
全网VIP视频在线解析可以免费观看[腾讯vip视频.爱奇艺vip视频.优酷VIP视频.土豆VIP视频.乐视VIP视频.芒果VIP视频]等等...可以vip免费观看.去广告等等. https vip视频 ...