Description

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

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

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

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

Solution

设一个四元组(i,l,r,t)表示当前以i为左端点,[l,r]一定为可行的区间的子集,t表示[l,r]最大前缀和的下标。维护一个堆,对于堆顶元素,贡献完答案后,插入(i,l,t−1,query(l,t−1))(i,l,t−1,query(l,t−1))(i,l,t-1,query(l,t-1))和(i,t+1,r,query(t+1,r))(i,t+1,r,query(t+1,r))(i,t+1,r,query(t+1,r))。可以用st表来维护。

Source

啥?用了make_heap卡常还比肖大佬跑得慢,果然自带大常数。。。

/************************************************* Au: Hany01* Date: Mar 2nd, 2018* Prob: [BZOJ2006][NOI2010] 超级钢琴* Email: hany01@foxmail.com
************************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define fir first
#define sec second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaiatemplate <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read()
{register int _, __; register char c_;for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}inline void File()
{
#ifdef hany01freopen("bzoj2006.in", "r", stdin);freopen("bzoj2006.out", "w", stdout);
#endif
}const int maxn = 500005, maxlog = 20;int n, k, L, R, Log2[maxn], f[maxn][maxlog], Sum[maxn];struct Item
{int st, l, r, ed;Item(int st = 0, int l = 0, int r = 0, int ed = 0): st(st), l(l), r(r), ed(ed) {}bool operator < (const Item& item) const {return Sum[ed] - Sum[st - 1] < Sum[item.ed] - Sum[item.st - 1];}
};inline void Init()
{n = read(), k = read(), L = read(), R = read(), Log2[0] = -1;For(i, 1, n) Sum[i] = Sum[i - 1] + read(), Log2[i] = Log2[i >> 1] + 1, f[i][0] = i;For(i, 1, Log2[n]) For(j, 1, n - (1 << i) + 1)if (Sum[f[j][i - 1]] > Sum[f[j + (1 << (i - 1))][i - 1]]) f[j][i] = f[j][i - 1]; else f[j][i] = f[j + (1 << (i - 1))][i - 1];
}inline int query(int l, int r) {int tmp = Log2[r - l + 1];if (Sum[f[l][tmp]] > Sum[f[r - (1 << tmp) + 1][tmp]]) return f[l][tmp]; else return f[r - (1 << tmp) + 1][tmp];
}inline void Solve()
{static Item q[maxn * 3], top;static int l, r, cnt = 0;static LL Ans = 0;For(i, 1, n) {l = i + L - 1, r = min(i + R - 1, n);if (l <= r) q[cnt ++] = Item(i, l, r, query(l, r));}make_heap(q, q + cnt);while (k --) {top = q[0], Ans += Sum[top.ed] - Sum[top.st - 1], pop_heap(q, q + cnt --);l = top.l, r = top.ed - 1;if (l <= r) q[cnt ++] = Item(top.st, l, r, query(l, r)), push_heap(q, q + cnt);l = top.ed + 1, r = top.r;if (l <= r) q[cnt ++] = Item(top.st, l, r, query(l, r)), push_heap(q, q + cnt);}printf("%lld\n", Ans);
}int main()
{File();Init();Solve();return 0;
}

【BZOJ2006】【NOI2010】超级钢琴(堆)相关推荐

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

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

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

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

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

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

  4. NOI2010超级钢琴

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

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

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

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

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

  7. P2048 [NOI2010]超级钢琴

    传送门 考虑维护前缀和 $sum[i]$ 那么对于每一个位置 $i$ ,左端点为 $i$ 右端点在 $[i+L-1,i+R-1]$ 区间的区间最大值容易维护 维护三元组 $(o,l,r)$ ,表示左端 ...

  8. [NOI2010] 超级钢琴

    题目类型:RMQ+堆 传送门:>Here< 题意:给出一个长度为\(N\)的序列\(a\),对于每一个\(i\)作为和弦的起点,长度可以是\(L \rightarrow R\).问所有和弦 ...

  9. 洛谷 P2048 [NOI2010]超级钢琴(优先队列,RMQ)

    传送门 我们定义$(p,l,r)=max\{sum[t]-sum[p-1],p+l-1\leq t\leq p+r-1 \}$ 那么因为对每一个$p$来说$sum[p-1]$是一个定值,所以我们只要在 ...

  10. P2048 [NOI2010] 超级钢琴(RMQ 贪心)

    文章目录 题目描述 解析 代码 传送门 题目描述 解析 首先,如果只有一个和弦,那么问题显然简单了 用前缀和结合ST表随便做做即可 然而 这次要求前k大的 怎么办呢? 参照之前有一道序列合并的做法 我 ...

最新文章

  1. SAP ECC APO Integration - CIF 简介
  2. 如何从Java中打印XML?
  3. pwn学习总结(五) —— 堆溢出经典题型整理
  4. VS2005 ATL WINDOWS服务感想
  5. 2020-10-13 多智能体基本图论
  6. ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍
  7. 数据 正则化 python_python3.6怎么单独正则化/标准化DataFrame中的指定列数据
  8. c语言不通包里的函数,C语言中实现不同函数间jump的方法 -电脑资料
  9. 第五章 卷积神经网络(CNN)
  10. ftp文件下载工具,四款超级好用的ftp文件下载工具
  11. jade选峰之后怎么去掉_教程丨用Jade软件处理XRD数据的步骤
  12. 管家婆系统怎么创建提醒服务器,管家婆辉煌Ⅱ++10.1 -管家婆软件官方网站
  13. matlab abort,matlab自动关闭是怎么回事???
  14. c语言编译器w7,wintc下载|c语言编译器wintc win7/win8兼容版 v2.0下载 64位32位 - 3322软件站...
  15. CS5216 Capstone DP to hdmi 1080p转换器或者转接线设计原理|CS5216 DP转HDMI转换电路原理图
  16. 如何学计算机课程,零基础应该如何学习电脑知识
  17. python三重积分_蒙特卡罗方法。三重积分。Python。“+”的操作数父级不受支持...
  18. 4月以来北京,上海,广州,深圳,杭州Java程序员涨工资400倒500,南京涨了800元
  19. python好玩的黑科技_用Python玩微信跳一跳黑科技详细使用教程
  20. RALL机制的线程锁

热门文章

  1. tensorflow强化学习之打乒乓球(Reinforcement Learning)
  2. 爬虫之“前戏” 二: http和https协议
  3. extends的使用
  4. rdflib解析protege的owl文件
  5. CSDN新版博客排名规则公示
  6. 【正点原子FPGA连载】第二十三章 DDS信号发生器实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  7. String、StringBuffer、StringBuilder的区别
  8. codeforces 233B(灵活运用公式枚举)
  9. Charm-crypto搭建CP-ABE密码系统
  10. angular手机应用_灵活且易于维护的Laravel + Angular材质应用