【贪心 计数】bzoj2006: [NOI2010]超级钢琴
这么经典的贪心我怎么现在才做啊……
Description
Input
Output
只有一个整数,表示乐曲美妙度的最大值。
Sample Input
3
2
-6
8
Sample Output
题目分析
定位:是一道堆例题
首先注意到k的规模不大,那么可以枚举k次。
考虑固定右端点,那么可以预处理出它合法的左端点以及前缀和最小的位置。

因为不能重复,所以用过的$l$对$r$不能再用。那么如果$r$再一次被当做右端点,$l'$要么在$l$左边要么在$l$右边。因此再把剩下的两个状态处理出来就可以了。
状态用一个五元组保存就行了;查询静态最优值则可以用st表预处理。
#include<bits/stdc++.h>
typedef long long ll;
const int maxn = ;
const int maxLog = ; struct node
{
int L,R,i,v,p;
node(int a=, int b=, int c=, int d=, int e=):L(a),R(b),i(c),v(d),p(e) {}
bool operator < (node a) const
{
return v < a.v;
}
};
int n,k,L,R,s[maxn],lgs[maxn],f[maxn][maxLog];
std::priority_queue<node> q;
ll ans; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
void STinit()
{
for (int i=; i<=n; i++) f[i][] = i; //这里要处理i=0,因为查询时候的[l',r']是[l,r]的前缀位置,即[l-1,r-1]
for (int j=; (<<j)<=n; j++)
for (int i=; i<=n; i++)
if (i+(<<j) < n){
int l = f[i][j-], r = f[i+(<<(j-))][j-];
if (s[l] > s[r]) f[i][j] = r;
else f[i][j] = l;
}
}
int STquery(int l, int r)
{
l--, r--;
int c = lgs[r-l+], x = f[l][c], y = f[r-(<<c)+][c];
return s[x] > s[y]?y:x;
}
int main()
{
n = read(), k = read(), L = read(), R = read(), lgs[] = -;
for (int i=; i<=n; i++) s[i] = s[i-]+read();
for (int i=; i<=n; i++) lgs[i] = lgs[i>>]+;
STinit();
for (int i=; i<=n; i++)
{
int lbd = std::max(i-R+, ), rbd = std::max(i-L+, );
if (i-rbd+ < L) continue;
int pos = STquery(lbd, rbd);
q.push(node(lbd, rbd, i, s[i]-s[pos], pos+));
}
while (k--)
{
node tt = q.top();
q.pop(), ans += tt.v;
int lbd = tt.L, rbd = tt.R, i = tt.i, p = tt.p, pos;
if (lbd < p){
pos = STquery(lbd, p-);
q.push(node(lbd, p-, i, s[i]-s[pos], pos+));
}
if (rbd > p){
pos = STquery(p+, rbd);
q.push(node(p+, rbd, i, s[i]-s[pos], pos+));
}
}
printf("%lld\n",ans);
return ;
}
END
【贪心 计数】bzoj2006: [NOI2010]超级钢琴的更多相关文章
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴
http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- bzoj2006 noi2010 超级钢琴 主席树 + 优先队列
Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2435 Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...
- BZOJ2006[NOI2010]超级钢琴——堆+主席树
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...
- 【题解】 bzoj2006: [NOI2010]超级钢琴 (ST表+贪心)
题面戳我 Solution 不会,看的题解 Attention 哇痛苦,一直不会打\(ST\)表,我是真的菜啊qwq 预处理 Log[1]=0;two[0]=1; for(int i=2;i<= ...
- BZOJ2006——[NOI2010]超级钢琴
1.题意:给一个序列,让你取出k个不同的区间,要求长度在之间,问所有区间和的最大值 2.分析:这道题拿过来就能知道是要拿出前k个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前 ...
随机推荐
- ASPNET Core 2.x中的Kestrel服务器
原文链接 Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库.ASP.NET Core模板项目使用Kestrel作为默认的web服务 ...
- linux网页资料链接
http://lab.xmirror.cn/ 玄镜官网 https://blog.csdn.net/zxgmdzz/article/details/79207944 Navicat Pre ...
- WordCount by C# 结对编程
合作者:201631062210,201631062110 Gitee项目地址:https://gitee.com/zhouyue98/learngit 本次作业的链接地址:https://edu.c ...
- Ubuntu16.04.2 LTS 64bit系统装机记录
系统环境:Win10 + Ubuntu16.04.2 LTS 64bit(双系统)安装教程:Win10和Ubuntu16.04双系统安装详解(简书)以下为系统安装后所要进行的操作. 一.安装显卡驱动 ...
- [Java]LinkedHashMap实现原理
1.概述 在理解了#7 介绍的HashMap后,我们来学习LinkedHashMap的工作原理及实现.首先还是类似的,我们写一个简单的LinkedHashMap的程序: LinkedHashMap&l ...
- namedJDBC查询
import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.spring ...
- Netty(7-2)传List
ObjectEchoServer protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ...
- 3D旋转仿伪3D立体效果,手机端
偶然在书上看到这段代码,感觉很舒服,直街附代码吧,原生JS.手机端旋转效果仿立体效果. 纯JS代码足够了. var img=document.createElement('img'); img.set ...
- VS2012快捷键消失
我也是网上搜的不过我认为挺有效就自己摘录下来了,具体原作者也找不到,所以就下手了,望原谅. 开始菜单 -->所有程序-->Visual Studio 2012文件夹 --> Visu ...
- Hibernate 事物隔离级别
Hibernate事务和并发控制 ++YONG原创,转载请注明 1. 事务介绍: 1.1. ...