BZOJ2006——[NOI2010]超级钢琴
1、题意:给一个序列,让你取出k个不同的区间,要求长度在之间,问所有区间和的最大值
2、分析:这道题拿过来就能知道是要拿出前k个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前k个最大的,这个思路的复杂度很高,达到 很明显,这会超时,我们尝试换个角度,我们维护一个大根堆我们枚举所有的区间的左端点,然后我在 这个区间中选一个区间最大的,和大根堆中的最小数比较,如果大,那就加入堆,然后比较次大的,这样的复杂度呢? 是不是感觉卵用没有,但是这个算法的复杂度远远达不到上界,虽然说卡这个算法还是比较容易的,然后进一步思考,我们每次都是固定左端点的选一个,那么能不能再全局中选呢?依旧是这样,我们维护一个大根堆,这次我们要将每一个左端点的最大值先加入堆中,然后我们每次取出最大值,将这个区间分成左右两段,这样就等于拿走次左端点的最大值,加入次大值和第三大….那么如此类推,我们搞到前k大,加起来就是answer了,时间复杂度,,空间嘛,我们思考一下,每一次我们都会将一个区间分裂成两个,但是只会分裂两次,所以空间是,完美解决,撒花QAQ,另附一组小数据,藏在代码中ovo
//myy orz
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 2000010
#define LL long long
#define inf 214748364
inline int read(){
char ch = getchar(); int x = 0, f = 1;
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
int a[M], sum[M];
struct Node{
int i, L, id, R, res;
inline bool operator < (const Node& rhs) const{
return res < rhs.res;
}
};
priority_queue<Node> Q;
struct myh{
int val, id;
inline bool operator < (const myh& rhs) const{
return val < rhs.val;
}
} q[M];
inline myh max(myh q1, myh q2){
if(q1 < q2) return q2;
return q1;
}
inline void build(int l, int r, int o){
if(l == r){
q[o].val = sum[l];
q[o].id = l;
return;
}
int mid = (l + r) / 2;
build(l, mid, 2 * o);
build(mid + 1, r, 2 * o + 1);
q[o] = max(q[2 * o], q[2 * o + 1]);
}
inline myh query(int l, int r, int o, int x, int y){
if(x <= l && r <= y) return q[o];
int mid = (l + r) / 2;
myh mx; mx.val = -inf;
if(x <= mid) mx = max(mx, query(l, mid, 2 * o, x, y));
if(y > mid) mx = max(mx, query(mid + 1, r, 2 * o + 1, x, y));
return mx;
}
int main(){
int n = read(), k = read(), L = read(), R = read();
for(int i = 1; i <= n; i ++) a[i] = read(), sum[i] = a[i] + sum[i - 1];
build(1, n, 1);
for(int i = 1; i <= n; i ++){
if(i + L - 1 > n) break;
myh yy = query(1, n, 1, i + L - 1, min(n, i + R - 1));
Node c = (Node){i, L, yy.id - i + 1, min(n, i + R - 1) - i + 1, yy.val - sum[i - 1]};
Q.push(c);
// printf("%d\n", yy.id);
}
LL ans = 0;
for(int i = 1; i <= k; i ++){
Node x = Q.top(); Q.pop();
ans += x.res;
//printf("%d::", x.res);
if(x.id > x.L){
myh yy = query(1, n, 1, x.i + x.L - 1, x.i + x.id - 2);
Node c = (Node){x.i, x.L, yy.id - x.i + 1, x.id - 1, yy.val - sum[x.i - 1]};
Q.push(c);
// printf("%d %d\n", yy.val - sum[x.i - 1], x.id);
}
if(x.id < x.R){
myh yy = query(1, n, 1, x.i + x.id, x.i + x.R - 1);
Node c = (Node){x.i, x.id + 1, yy.id - x.i + 1, x.R, yy.val - sum[x.i - 1]};
Q.push(c);
// printf("%d\n", yy.val - sum[x.i - 1]);
}
}
printf("%lld\n", ans);
return 0;
}
/*
10 13 3 7
595
384
-435
-197
-677
661
4
-100
-653
220
*/
BZOJ2006——[NOI2010]超级钢琴的更多相关文章
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- 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]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- 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]超级钢琴
这么经典的贪心我怎么现在才做啊…… Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个 ...
- bzoj2006: [NOI2010]超级钢琴
题意:给一个序列(n<=500000),要求选定k个不同区间,使得区间长度在L,R之间,并使得k个区间和之和最大,输出这个最大值. 刚拿到题的时候想的是,对于每个点,如果以它开头,那么之后的L- ...
随机推荐
- [No000080]右键解锁增强Chrome插件开发,破除防复制
昨天用360极速(虽然我不喜欢360.)浏览器,登陆知乎查阅一些东西,突然感觉有些观点很赞同,想copy转载一下,我了个去,它丫的居然不让我复制. 地址:https://www.zhihu.com/q ...
- 使用Cordova和JQM在ios上需要注意的问题
1.ios编译 cordova platform add ios --save cordova build ios 2.IOS 微信和地图調用問題:因IOS 9.0以上版本白名單限制,衹有加入白名單的 ...
- 2.0 (2)测试pymongo
在数据库中创建数据库.表,插入数据. from pymongo import MongoClient host = "localhost" port = 27017 client ...
- Django登录访问限制 login_requeired
作用: 1. 用户登录之后才可以访问某些页面 2. 如果没登录,跳转到登录页面 3. 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址 要实现这个需求很简单就是在相应的view前面使用装 ...
- mysql5.7.10 的源码安装
mysql 5.7.10的源码安装:http://fyduan.blog.51cto.com/4234935/1729873cmake . -DCMAKE_INSTALL_PREFIX=/usr/lo ...
- 使用Python进行描述性统计
目录 1 描述性统计是什么?2 使用NumPy和SciPy进行数值分析 2.1 基本概念 2.2 中心位置(均值.中位数.众数) 2.3 发散程度(极差,方差.标准差.变异系数) 2.4 偏差程度(z ...
- oracle 表字段添加 修改 删除语法
修改列名 alter table 表明 rename column rename 老列名 to 新列名添加 字段alter table 表名 add(字段名 类型):删除字段alter table 表 ...
- 运维请注意:”非常危险“的Linux命令大全
Linux命令是一种很有趣且有用的东西,但在你不知道会带来什么后果的时候,它又会显得非常危险.所以,在输入某些命令前,请多多检查再敲回车. rm –rf rm –rf是删除文件夹和里面附带内容的一种最 ...
- Wifi代替数据线调试
我们通常都是使用USB线连接设备和电脑进行的程序调试. 有的程序本身就要使用USB口,例如一个文件浏览器,它可以列出通过USB接口接入的U盘. 在调试这样的应用的时候,USB接口被占用了,但设备也只有 ...
- ToString和Convert.ToString处理null值
http://www.cnblogs.com/qinge/p/5687806.html文章来源 1.Convert.ToString能处理字符串为null的情况. 测试代码如下: 1 2 3 4 5 ...