此题求长度在l,r,之间内的区间的前k大之和

1.静态区间第k大,不就是主席树么!

可是不会写啊,以后填坑吧

2.优先队列

固定左端点,选取以此为起点的长度l<=x<=r的区间,固定此范围后寻找此范围内最大所到位置t;

由于左端点已经固定且每次i相同的操作下只将一个点放入优先队列,故不会出现重复;

注意:rmq维护的是最大的前缀和所在位置,返回的也是位置

  1. #include<bits/stdc++.h>
  2. #define rep(i,x,y) for(register int i=x;i<=y;i++)
  3. #define ll long long
  4. using namespace std;
  5. const int N=;
  6. const int Logn=;
  7. inline int read(){
  8. int x=,f=;char ch=getchar();
  9. while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
  10. while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
  11. return x*f;}
  12. namespace zjc{
  13. int n,k,L,R,a[N],sum[N],f[N][Logn],lg[N];ll ans;
  14.  
  15. struct node{int op,l,r,t;
  16. friend bool operator <(node x,node y){
  17. return sum[x.t]-sum[x.op-]<sum[y.t]-sum[y.op-];}
  18. };priority_queue<node> q;
  19.  
  20. void init(){
  21. lg[]=-;
  22. rep(i,,n) f[i][]=i,lg[i]=lg[i>>]+;
  23. rep(j,,Logn)for(int i=;i+(<<j)-<=n;i++)
  24. f[i][j]=sum[f[i][j-]]>sum[f[i+(<<j-)][j-]]?f[i][j-]:f[i+(<<j-)][j-];
  25. }
  26. int query(int x,int y){
  27. int s=lg[y-x+];
  28. return sum[f[x][s]]>sum[f[y-(<<s)+][s]]?f[x][s]:f[y-(<<s)+][s];
  29. }
  30. void work(){
  31. n=read(),k=read(),L=read(),R=read();
  32. rep(i,,n) a[i]=read(),sum[i]=sum[i-]+a[i];
  33. init();
  34. for(int i=;i+L-<=n;i++){
  35. int l=i+L-,r=min(i+R-,n);
  36. int t=query(l,r);
  37. q.push((node){i,l,r,t});
  38. }
  39. for(int i=;i<=k;i++){
  40. node u=q.top();q.pop();
  41. ans+=sum[u.t]-sum[u.op-];
  42. if(u.l<=u.t-) q.push((node){u.op,u.l,u.t-,query(u.l,u.t-)});
  43. if(u.t+<=u.r) q.push((node){u.op,u.t+,u.r,query(u.t+,u.r)});
  44. }
  45. printf("%lld\n",ans);return;
  46. }
  47. }
  48. int main(){
  49. freopen("seq.in","r",stdin);
  50. freopen("seq.out","w",stdout);
  51. zjc::work();
  52. return ;
  53. }

luogu 2048 超级钢琴 贪心+堆+RMQ的更多相关文章

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

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

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

    点此看题面 大致题意: 要你求出区间和前\(k\)大的区间的区间和之和,其中每个区间的大小在\(L\)与\(R\)之间. 堆+\(RMQ\) 这道题目,我们可以先对\(1\sim n\)中的每一个\( ...

  3. bzoj2006: [NOI2010]超级钢琴(堆+RMQ)

    和上一道题同类型...都是用堆求第k大 考虑对于每一个r,怎么求出一个最优的l.显然只需要求出前缀和,用RMQ查询前面最小的l的前缀和就好了.但是对于一个r,每个l只能选一次,选了一次之后,考虑怎么把 ...

  4. BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)

    BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...

  5. [NOI2010] 超级钢琴 - 贪心,堆,ST表

    这也算是第K大问题的套路题了(虽然我一开始还想了个假算法),大体想法就是先弄出最优的一批解,然后每次从中提出一个最优解并转移到一个次优解,用优先队列维护这个过程即可. 类似的问题很多,放在序列上的,放 ...

  6. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

  7. 洛谷$P$2048 超级钢琴 $[NOI2010]$ $rmq$/主席树

    正解:$rmq$/主席树 解题报告: 传送门! 好像看过这题挺多次辣,,,$QwQ$ 之前$NOIp$的时候$cjk$学长讲课讲了这题(虽然那时候的$gql$太菜辣并麻油落实这道_(:з」∠)_,然后 ...

  8. P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)

    P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...

  9. [NOI2010]超级钢琴(RMQ+堆)

    小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负 ...

随机推荐

  1. Picture POJ - 1177 (扫描线)

    扫描线求周长,可以看成两条线,一条扫x轴,一条扫y轴,然后这两天线扫过去的 周长加起来,就是周长了 #include<map> #include<set> #include&l ...

  2. 解决使用jedis连接是报DENIED Redis is running in protected mode错误

    DENIED Redis is running in protected mode because protected mode is enabled, no bind address was spe ...

  3. MVC Razor

    1.@....    相当于<%=...%> 2.@{}  相当于<%%>,遇到无法自动转换的,需要在前面加@: 3.@()  将某一段代码当做C#代码 4.表单提交name值 ...

  4. SRM 600 div 2 T 1

      贪心+枚举 #include <bits/stdc++.h> using namespace std; class TheShuttles { public: int getLeast ...

  5. openvpn部署账号密码登录

    1.开启服务器端路由转发功能: 修改配置文件/etc/sysctl.conf中 net.ipv4.ip_forward = 0 改为 net.ipv4.ip_forward = 1 [root@nod ...

  6. linux系统调用之用户管理

    getuid 获取用户标识号 setuid 设置用户标志号 getgid 获取组标识号 setgid 设置组标志号 getegid 获取有效组标识号 setegid 设置有效组标识号 geteuid ...

  7. 第一节,初识OpenCV3-图像的读、写、显、格式转化等

    之前一直在看深度学习,突然用到了对图像处理的东西,所以过来补充一下OpenCV基础. 就顺便从网上了买了一本OpenCV 3计算机视觉这本书,这本书比较薄,但是目前已经够我用了,在这里就记录一下我的学 ...

  8. operator new和operator delete

    从STL源码剖析中看到了operator new的使用 template<class T> inline void _deallocate(T* buffer) { ::operator ...

  9. Windows 查看端口占用情况

    今天打算运行一下当年的毕业设计,结果启动ActiveMQ的时候,发现报错 原来是端口占用了.在Windows上怎样看呢? Ctrl+Alt+Del 调出任务管理器 再找到资源监视器 原来是依赖于Erl ...

  10. redis4.0.6集群搭建

    文件环境:CentOS7 + redis4.0.6 先去官网下载redis:https://redis.io/,然后上传到你的虚拟机,我上传到了/mysoft 先解压->然后进入主目录-> ...