【贪心 计数】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个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前 ...
 
随机推荐
- nutzboot 使用nacos替换zookeeper
			
先放一段从网上拷贝一段分布式CAP理论的概念 分布式领域中存在CAP理论,且该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾. ①C:Consistency,一致性,数据一致更新,所有数据 ...
 - Codeforces Round #561 (Div. 2) B. All the Vowels Please
			
链接:https://codeforces.com/contest/1166/problem/B 题意: Tom loves vowels, and he likes long words with ...
 - Codeforces 1168C(二进制、dp)
			
要点 '&'操作暗示二进制上按位思考 对于y为1的位,要求x和y之间要至少有两个此位为1的(包含x.y),这样&起来才不是0.而这些位中只要存在一个是ok的即可 dp去求每个x的每个位 ...
 - 2017ACM/ICPC广西邀请赛 CS Course
			
题意:删除指定数字,求剩下数字的与或非值 解法:保存一下前缀和后缀 #include <iostream> #include <stdio.h> #include <ve ...
 - 四则运算二(java web)
			
最近我和我的小伙伴yaoyali结成对子,共同写网页版的四则运算.虽然现在还没弄好,但是比起上次用纯java写的四则运算有了很大改进. 一.存放四则运算题目和答案的类 package com.jaov ...
 - (转) RHEL7 忘记密码修改root密码
			
博客链接:http://blog.csdn.net/derkampf/article/details/54346516 RHEL7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ct ...
 - (转)通过MySQL复制线程SQL_Thread加快增量恢复binlog
			
数据回档常常是使用全量备份+binlog增量实现的.而数据量很大的情况下,增量恢复binlog一直是一个苦恼的问题,因为恢复binlog速度十分慢,并且容易出错. 恢复binlog文件一般有两种方法: ...
 - Spark Mllib里如何将数据取消暂存在内存中(图文详解)
			
不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第18章 决策树回归分类Bike Sharing数据集
 - spring中自动装配bean
			
首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...
 - 2018年湘潭大学程序设计竞赛G又见斐波那契(矩阵快速幂)
			
题意 题目链接 Sol 直接矩阵快速幂 推出来的矩阵应该长这样 \begin{equation*}\begin{bmatrix}1&1&1&1&1&1\\1 & ...