题目描述

小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。

这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。

一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。

小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。

输入输出格式

输入格式:

输入第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。

接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。

输出格式:

输出只有一个整数,表示乐曲美妙度的最大值。

输入输出样例
输入样例#1:

4 3 2 3
3
2
-6
8

输出样例#1:

11

说明

共有5种不同的超级和弦:

  1. 音符1 ~ 2,美妙度为3 + 2 = 5
  2. 音符2 ~ 3,美妙度为2 + (-6) = -4
  3. 音符3 ~ 4,美妙度为(-6) + 8 = 2
  4. 音符1 ~ 3,美妙度为3 + 2 + (-6) = -1
  5. 音符2 ~ 4,美妙度为2 + (-6) + 8 = 4

最优方案为:乐曲由和弦1,和弦3,和弦5组成,美妙度为5 + 2 + 4 = 11。

题解

堆+st表

我们定义一个三元组\((s, l, r)\) 表示以s为左端点 右端点在\(l-r\)这段区间内区间和最大
维护一个前缀和
贪心地想,既然\(s\)已经固定那么对于右端点在\(l-r\)这段区间内,我们要取前缀和最大的那个值,st搞一下就好了

定义\(t\)为\(l-r\)区间前缀和最大的位置

我们维护一个堆

每次取出价值最大

然后把\((s, l, t-1) (s, t+1, r)\)放进去

注意特判一下\(l=t, r=t\)的情况

Code

#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std;inline int gi() {int f = 1, s = 0;char c = getchar();while (c != '-' && (c < '0' || c > '9')) c = getchar();if (c == '-') f = -1, c = getchar();while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();return f == 1 ? s : -s;
}
const int N = 500010;
int mx[N][21], a[N], n, k, L, R;
LL sum[N];
void init() {for (int i = 1; i <= n; i++)mx[i][0] = i;for (int i = 1; (1<<i) <= n; i++)for (int j = 1; j + (1<<i) - 1 <= n; j++) {int x = mx[j][i-1], y = mx[j+(1<<(i-1))][i-1];mx[j][i] = sum[x] > sum[y] ? x : y;}return ;
}inline int getmax(int l, int r) {int k = log2(r-l+1), x = mx[l][k], y = mx[r-(1<<k)+1][k];return sum[x] > sum[y] ? x : y;
}struct node {int s, l, r, t;bool operator <(node z) const {return (sum[t]-sum[s-1]) < (sum[z.t]-sum[z.s-1]);}
};
priority_queue<node> q;int main() {n = gi(), k = gi(), L = gi(), R = gi();for (int i = 1; i <= n; i++) {a[i] = gi();sum[i] = sum[i-1]+a[i];}init();for (int i = 1; i+L-1 <= n; i++)q.push((node) {i, i+L-1, min(n, i+R-1), getmax(i+L-1, min(n, i+R-1))});LL ans = 0;for (int i = 1; i <= k; i++) {int l = q.top().l, r = q.top().r, s = q.top().s, t = q.top().t;q.pop();ans += sum[t]-sum[s-1];if (t != l)q.push((node) {s, l, t-1, getmax(l, t-1)});if (t != r)q.push((node) {s, t+1, r, getmax(t+1, r)});}printf("%lld\n", ans);return 0;
}

转载于:https://www.cnblogs.com/zzy2005/p/9876312.html

洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴相关推荐

  1. bzoj 2006 [NOI2010]超级钢琴 rmq+堆

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3708  Solved: 1846 [Submit][Sta ...

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

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

  3. P2048 [NOI2010] 超级钢琴(ST表 + 优先队列优化)

    P2048 [NOI2010] 超级钢琴 题目 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 ...

  4. [NOI2010]超级钢琴 主席树

    [NOI2010]超级钢琴 链接 luogu 思路 和12省联考的异或粽子一样. 堆维护n个左端点,每次取出来再放回去次 代码 #include <bits/stdc++.h> #defi ...

  5. NOI2010超级钢琴

    **NOI2010 超级钢琴** **Description** 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 ...

  6. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...

  7. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  8. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  9. 贪心(数据结构):COGS 468. [NOI2010]超级钢琴

    ★★★☆   输入文件:piano.in   输出文件:piano.out   简单对比 时间限制:2 s   内存限制:512 MB 超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送 ...

  10. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT

    题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...

最新文章

  1. python cnn代码详解图解_TextCNN 代码详解(附测试数据集以及GitHub 地址)
  2. [svc]arp协议的细枝末节
  3. PHP多进程编程初步
  4. 8086汇编常用指令(待解释)
  5. (素材源代码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象牛逼Demo
  6. codeforces - 766B【三角形判断】
  7. SQL Server创建Job, 实现执行相同脚本而产生不同作业计划的探究
  8. python字符串是否包含某元素_Python实现判断一个字符串是否包含子串的方法总结...
  9. delphi webbrowser 对象不支持_建模初学者,那些你可能还不知道的10个ZBrush小技巧!【值得收藏】...
  10. 时富金融:八年左右后内地房价会下降
  11. L - All in All(子序列)
  12. Code Style Guidelines for Contributors Reading Notes
  13. 如何使用Deckset配置编辑命令
  14. 全球及中国水电行业开发规划及十四五投资战略报告2021年版
  15. 4.STACEY矩阵及其对应的开发模型、敏捷开发评估方法
  16. 三位水仙花数python代码
  17. 【JavaScript】相关知识学习笔记
  18. SCI论文投稿全程邮件模板
  19. 解决:JedisNoReachableClusterNodeException: No reachable node in clust
  20. [转贴]百度和谷歌:局域网战胜互联网

热门文章

  1. 高并发之 API 接口,分布式,防刷限流,如何做?
  2. GitHub遭遇史上最强DDoS攻击:峰值流量1.35Tbps!
  3. jmeter 控制偏离_Jmeter 笔记(1)-安装 基本组件
  4. 佳能hdr_佳能发布Cinema EOS系统首款RF卡口 4K数字电影摄影机EOS C70
  5. python 服务器_使用 Python 开发 EMQ X MQTT 服务器插件
  6. 微信小程序wx.navigateTo无法跳转
  7. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研
  8. Java并发编程原理与实战十一:锁重入自旋锁死锁
  9. 比较List和ArrayList的性能及ArrayList和LinkedList优缺点
  10. Ibatis -- 一次执行多条SQL