https://loj.ac/problem/504

题解

对于区间取\(\max\),这个比较好办,直接在线段树上打标记就行了。

如果让我们弹出前\(n\)个数,我们可以用类似超级钢琴的思想,队列中每个元素是一个线段树节点,弹出时记录最值的位置,然后分成两半继续做就行了。

代码

  1. #include<bits/stdc++.h>
  2. #define N 500009
  3. using namespace std;
  4. typedef long long ll;
  5. int n,a[N],m;
  6. int tr[N<<2],pos[N<<2],la[N<<2];
  7. int ans[N],top;
  8. bool tag[N<<2];
  9. inline ll rd(){
  10. ll x=0;char c=getchar();bool f=0;
  11. while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
  12. while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
  13. return f?-x:x;
  14. }
  15. struct node{
  16. int nw,l,r;
  17. inline bool operator <(const node &b)const{
  18. return tr[nw]>tr[b.nw];
  19. }
  20. };
  21. priority_queue<node>q;
  22. inline void pushup(int cnt){
  23. tr[cnt]=tr[cnt<<1];pos[cnt]=pos[cnt<<1];
  24. if(tr[cnt<<1|1]<tr[cnt])tr[cnt]=tr[cnt<<1|1],pos[cnt]=pos[cnt<<1|1];
  25. }
  26. inline void pushdown(int cnt){
  27. la[cnt<<1]=max(la[cnt<<1],la[cnt]);
  28. la[cnt<<1|1]=max(la[cnt<<1|1],la[cnt]);
  29. tr[cnt<<1]=max(tr[cnt<<1],la[cnt]);
  30. tr[cnt<<1|1]=max(tr[cnt<<1|1],la[cnt]);
  31. la[cnt]=0;
  32. }
  33. void build(int cnt,int l,int r){
  34. if(l==r){
  35. pos[cnt]=l;
  36. tr[cnt]=a[l];
  37. tag[cnt]=1;
  38. return;
  39. }
  40. int mid=(l+r)>>1;
  41. build(cnt<<1,l,mid);
  42. build(cnt<<1|1,mid+1,r);
  43. pushup(cnt);
  44. }
  45. void upd(int cnt,int l,int r,int L,int R,int x){
  46. if(l>=L&&r<=R){
  47. tr[cnt]=max(tr[cnt],x);
  48. la[cnt]=max(la[cnt],x);
  49. return;
  50. }
  51. int mid=(l+r)>>1;
  52. if(la[cnt])pushdown(cnt);
  53. if(mid>=L)upd(cnt<<1,l,mid,L,R,x);
  54. if(mid<R)upd(cnt<<1|1,mid+1,r,L,R,x);
  55. pushup(cnt);
  56. }
  57. void query(int cnt,int l,int r,int L,int R){
  58. if(l>=L&&r<=R){
  59. q.push(node{cnt,l,r});
  60. return;
  61. }
  62. int mid=(l+r)>>1;
  63. if(la[cnt])pushdown(cnt);
  64. if(mid>=L)query(cnt<<1,l,mid,L,R);
  65. if(mid<R)query(cnt<<1|1,mid+1,r,L,R);
  66. }
  67. int main(){
  68. n=rd();
  69. for(int i=1;i<=n;++i)a[i]=rd();
  70. build(1,1,n);
  71. m=rd();
  72. int opt,l,r,k,x;
  73. while(m--){
  74. opt=rd();l=rd();r=rd();k=rd();
  75. if(opt==1){
  76. upd(1,1,n,l,r,k);
  77. }
  78. else{
  79. x=rd();
  80. while(!q.empty())q.pop();
  81. query(1,1,n,l,r);
  82. for(int i=1;i<=x;++i){
  83. if(q.empty())break;
  84. int cnt=q.top().nw;
  85. node y=q.top();q.pop();
  86. if(tr[cnt]>=k)break;
  87. ans[++top]=tr[cnt];
  88. if(tag[cnt])continue;
  89. pushdown(cnt);
  90. if(y.l<=pos[cnt]-1)query(cnt,y.l,y.r,y.l,pos[cnt]-1);
  91. if(pos[cnt]+1<=y.r)query(cnt,y.l,y.r,pos[cnt]+1,y.r);
  92. }
  93. if(top==x){for(int i=1;i<=top;++i)printf("%d ",ans[i]);puts("");}
  94. else puts("-1");
  95. top=0;
  96. }
  97. }
  98. return 0;
  99. }

LOJ504「LibreOJ β Round」ZQC 的手办的更多相关文章

  1. 「LibreOJ β Round」ZQC 的手办

    https://loj.ac/problem/504 一类套路题. 首先这个玩意可以两个logn树套树做.... naive地,把区间内的所有数拿出来放进堆里.不断取出. 太多了. 所以开始只保留那初 ...

  2. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  3. #505. 「LibreOJ β Round」ZQC 的游戏

    题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...

  4. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...

  5. LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)

    题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...

  6. loj#501 「LibreOJ β Round」ZQC 的树列

    分析 代码(我的代码是瞎jb水过去的) #include<bits/stdc++.h> using namespace std; #define li long long li a[]; ...

  7. loj#500 「LibreOJ β Round」ZQC 的拼图

    分析 二分倍数 然后考虑dp[i][j]表示选到第i个x轴覆盖到j的情况y轴最多覆盖多少 贡献柿子可以画图然后相似三角形得到 代码 #include<bits/stdc++.h> usin ...

  8. [LOJ#500]「LibreOJ β Round」ZQC的拼图

    题目   点这里看题目. 分析   首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\).   考虑如何去判断当前的答案.设这个答案为 ...

  9. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

随机推荐

  1. ubuntu 虚拟机安装

    ubuntu16.04.5 LTS 安装   1.下载ubuntu镜像 打开ubuntu官网镜像地址https://launchpad.net/ubuntu/+cdmirrors 在上面中搜索chin ...

  2. (4.24)【mysql、sql server】分布式全局唯一ID生成方案

    参考:分布式全局唯一ID生成方案:https://blog.csdn.net/linzhiqiang0316/article/details/80425437 分表生成唯一ID方案 sql serve ...

  3. 搜索专题: HDU1026Ignatius and the Princess I

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. IDEA--错误:找不到或无法加载XXXXX--解决方法--创建javafx或其他项目出现的问题

    今天一上午超厂长在学习javafx的时候,总是创建一个然后运行就会出现 出现错误:找不到或无法加载主类 找了二个小时,都说是jdk或者其他环境配置问题 按照那些改了也没用重新创建一个也提示出现错误:找 ...

  5. TMS320F28335——SPI使用笔记

    一.SPI硬件接口 GPIO54    -------    SPISIMOA GPIO55    -------    SPISOMIA GPIO56    -------    SPCLK GPI ...

  6. Chrome开发者工具详解(四)之Elements、Console、Sources面板

    Elements面板 实时编辑DOM节点和CSS样式 双击DOM树视图里面的节点,可以实时编辑标签属性,修改的效果会立刻反应在浏览器里 点击右侧Style面板,可以实时修改CSS的属性值,这里面的所有 ...

  7. es7.2版本安装ik分词

    (一)到官网下载https://github.com/medcl/elasticsearch-analysis-ik对应版本的ik(直接下载releases版本,避免maven打包!!!如果不是这个版 ...

  8. Docker 安装、卸载、启动、停止

    1.1 查看当前系统的内核版本 查看当前系统的内核版本是否高于 3.10 英文文档:https://docs.docker.com/ 中文文档:https://docs.docker-cn.com/  ...

  9. 对 django rest framework框架的认识

    - 路由 - 可以通过as_view传参数,根据请求方式不同执行相应的方法 - 可以在url中设置一个结尾,类似于: .json - 视图 - 帮助开发者提供了一些类,并在类中提供了多个方法以供我们使 ...

  10. 初学Git——命令总结

    首先,感谢廖雪峰老师制作的Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0 ...