这道题题号很清新啊!第一次开NOI的题,因为最近考到了这道题的升级版

我们先考虑\(O(n^2)\)大暴力,就是枚举前后端点然后开一个前缀和减一下即可。

然后引入正解,我们设一个三元组\(F(s,l,r)\)表示以\(s\)为左端点,右端点的范围在\([l,r]\)的时候最优的右端点为多少。

左端点确定了,右端点的区间也确定了,那么右端点的位置怎么求?

RMQ直接查询即可。由于要求值最大,因此我们RMQ出前缀和最大值即可

然后我们就可以得到一些三元组,考虑如何计算答案。

我们还是通过取最大值这点性质想到。因此我们用大根堆来维护,而要维护的东西应该就是这个区间的值了。

然后前缀和的作用就出来了。我们在比较时让键值为\(sum_t-sum_{s-1}\)即可。

当我们取出一个解时,注意以\(s\)为左端点的区间就不是没有用了,我们可以把它按选择的最优位置分裂成两半然后再扔回堆里为后续的做准备。

具体实现看CODE

#include<cstdio>
#include<cctype>
#include<queue>
using namespace std;
const int N=500005,P=25;
int n,k,l,r,sum[N],log[N];
long long ans;
struct data
{int s,l,r,t;bool operator <(const data x) const { return sum[x.t]-sum[x.s-1]>sum[t]-sum[s-1]; }
};
struct RMQ
{int x,num;
}f[N][P];
priority_queue<data> big;
inline char tc(void)
{static char fl[100000],*A=fl,*B=fl;return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{x=0; char ch; int flag=1; while (!isdigit(ch=tc())) flag=ch^'-'?1:-1;while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); x*=flag;
}
inline int min(int a,int b)
{return a<b?a:b;
}
inline void log_init(void)
{for (register int i=2;i<=n;++i)log[i]=log[i>>1]+1;
}
inline void RMQ_init(void)
{for (register int j=1;j<P;++j)for (register int i=1;i+(1<<j)-1<=n;++i)f[i][j]=f[i][j-1].x>f[i+(1<<j-1)][j-1].x?f[i][j-1]:f[i+(1<<j-1)][j-1];
}
inline int query(int l,int r)
{int k=log[r-l+1];return f[l][k].x>f[r-(1<<k)+1][k].x?f[l][k].num:f[r-(1<<k)+1][k].num;
}
int main()
{//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);register int i; read(n); read(k); read(l); read(r); for (i=1;i<=n;++i)read(sum[i]),sum[i]+=sum[i-1],f[i][0]=((RMQ){sum[i],i});log_init(); RMQ_init(); for (i=1;i<=n;++i)if (i+l-1<=n) big.push((data){i,i+l-1,min(n,i+r-1),query(i+l-1,min(n,i+r-1))});while (k--){data now=big.top(); big.pop(); ans+=sum[now.t]-sum[now.s-1];if (now.l^now.t) big.push((data){now.s,now.l,now.t-1,query(now.l,now.t-1)});if (now.r^now.t) big.push((data){now.s,now.t+1,now.r,query(now.t+1,now.r)});}return printf("%lld",ans),0;
}

转载于:https://www.cnblogs.com/cjjsb/p/9276438.html

Luogu P2048 [NOI2010]超级钢琴相关推荐

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

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

  2. P2048 [NOI2010]超级钢琴

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

  3. 洛谷 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]$是一个定值,所以我们只要在 ...

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

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

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

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

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

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

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

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

  8. NOI2010超级钢琴

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

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

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

  10. [NOI2010] 超级钢琴

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

最新文章

  1. Mastercam X4中文版三维造型设计基础与典型范例
  2. win7笔记本设置wifi热点
  3. Matlab如何读取文本文件
  4. Excel vba引用工作表的三种写法
  5. 20、查看帮助的命令--man,info,whatis,--help
  6. 动态切换数据库连接配置简单示例
  7. [转载] python通过反射执行代码
  8. H5获取html标签
  9. ASC码表 和 转义字符表
  10. 零知识证明 Zero Knowledge Proof 以及 Layer2、跨链介绍
  11. 犬类水疗跑步机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. [Angular] ng-alain的一些实践
  13. Flutter中的多选按钮组件Checkbox
  14. OWC生成统计报表(柱形图)
  15. win7 系统增加自定义分辨率_【文献转载】GT5000便携式多参数土壤呼吸测量系统用于冬小麦田间土壤氧化亚氮释放量的测量...
  16. 华为备胎除了鸿蒙还有什么,硬件有备胎软件也有!华为鸿蒙操作系统曝光:或可取代安卓Win...
  17. 超高频RFID涉密资产智能档案柜应用
  18. 计算机及数控编程仿真软件exsl-win7,数控铣编程与仿真实验指导书新
  19. UI设计之动画—从虚拟到现实
  20. micro python 读写u盘_MicroPython开发板TPYBoard关于USB-HID的应用

热门文章

  1. 「leetcode」本周小结!(回溯算法系列二)
  2. Lightroom Classic 教程,如何在 Lightroom 中创建晕影?
  3. indesign排版实例教程,如何更改页面大小?
  4. InDesign入门教程,如何链接图形?
  5. Pr 入门教程,如何处理图片文件?
  6. 解压软件Bandizip Archiver for mac
  7. Mac触发角(Hot Corners) 进阶技巧
  8. TCP的send与recv函数小结
  9. [20180423]表空间闪回与snapshot standby
  10. c++ c超简单的求公约数