题目链接

----------------------

题目大意:给定一个长度为$n$的序列${a_i}$。现在有$m$个区间$[l_i,r_i]$和$q$个操作,每次选取一个$x$使得$a_x--$。问每一次操作后区间和为$0$的区间个数。

可以用主席树解决,但蒟蒻不会,蒟蒻只会写线段树QAQ。

对于每一个区间$[l_i,r_i]$,我们可以把它分解成线段树上$s$个区间,线段树每个结点维护一个向量数组,用来存包含它的区间。当某一个$a_x--$后,看线段树上区间和是否为0,如果是那么包含这个区间的区间$s--$。如果$s=0$那么$ans++$。

注意$update$向上回溯时也要判断一下是否为0,进行更新。

时间复杂度$O((m+q)\log n+n)$。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,q,m,a[],ans;
  4. struct node
  5. {
  6. vector<int> v;
  7. int l,r,val;
  8. }tree[];
  9. struct Node
  10. {
  11. int l,r,s;
  12. }t[];
  13. inline int read()
  14. {
  15. int x=,f=;char ch=getchar();
  16. while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
  17. while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
  18. return x*f;
  19. }
  20. inline void build(int index,int l,int r)
  21. {
  22. tree[index].l=l;
  23. tree[index].r=r;
  24. if (l==r)
  25. {
  26. tree[index].val=a[l];
  27. return;
  28. }
  29. int mid=(l+r)>>;
  30. build(index*,l,mid);
  31. build(index*+,mid+,r);
  32. tree[index].val=tree[index*].val+tree[index*+].val;
  33. }
  34. inline void update(int index,int pos,int v)
  35. {
  36. if (tree[index].l==tree[index].r)
  37. {
  38. tree[index].val+=v;
  39. if (tree[index].val==)
  40. {
  41. for (int i=;i<tree[index].v.size();i++)
  42. {
  43. t[tree[index].v[i]].s--;
  44. if (t[tree[index].v[i]].s==) ans++;
  45. }
  46. }
  47. return;
  48. }
  49. int mid=(tree[index].l+tree[index].r)>>;
  50. if (pos<=mid) update(index*,pos,v);
  51. else update(index*+,pos,v);
  52. tree[index].val=tree[index*].val+tree[index*+].val;
  53. if (tree[index].val==)
  54. {
  55. for (int i=;i<tree[index].v.size();i++)
  56. {
  57. t[tree[index].v[i]].s--;
  58. if (t[tree[index].v[i]].s==) ans++;
  59. }
  60. }
  61. }
  62. inline void split(int index,int l,int r,int id)
  63. {
  64. if (l<=tree[index].l&&tree[index].r<=r)
  65. {
  66. tree[index].v.push_back(id);
  67. t[id].s++;
  68. return;
  69. }
  70. int mid=(tree[index].l+tree[index].r)>>;
  71. if (l<=mid) split(index*,l,r,id);
  72. if (r>mid) split(index*+,l,r,id);
  73. }
  74. int main()
  75. {
  76. n=read(),m=read();
  77. for (int i=;i<=n;i++) a[i]=read();
  78. build(,,n);
  79. for (int i=;i<=m;i++) t[i].l=read(),t[i].r=read();
  80. for (int i=;i<=m;i++) split(,t[i].l,t[i].r,i);
  81. q=read();
  82. while(q--)
  83. {
  84. int x=read();
  85. x=(x+ans-)%n+;
  86. update(,x,-);
  87. printf("%d\n",ans);
  88. }
  89. return ;
  90. }

【BZOJ4631】踩气球 题解(线段树)的更多相关文章

  1. 【BZOJ4631】踩气球 链表+线段树+堆

    [BZOJ4631]踩气球 Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操 ...

  2. 【BZOJ 4631】4631: 踩气球 (线段树)

    4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 316  Solved: 153 Description 六一儿童节到了, SHUX ...

  3. bzoj4631踩气球

    bzoj4631踩气球 题意: 有一个序列和一个区间集合,每次将序列中的一个数-1,求此时集合里有多少个区间和为0.序列大小≤100000,区间数≤100000,操作数≤100000. 题解: 此题解 ...

  4. POJ2182题解——线段树

    POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...

  5. luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set

    不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...

  6. 理想乡题解 (线段树优化dp)

    题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ...

  7. BZOJ4631 : 踩气球

    将所有盒子插入链表,每当一个盒子变空时,从链表里删去它. 查一下它的前驱后继$pre,nxt$,那么$[pre+1,nxt-1]$都是空的. 每次对于$[A,B]$这段都为空,对小朋友按$R$维护线段 ...

  8. POJ 3468 A Simple Problem with Integers(详细题解) 线段树

    这是个线段树题目,做之前必须要有些线段树基础才行不然你是很难理解的. 此题的难点就是在于你加的数要怎么加,加入你一直加到叶子节点的话,复杂度势必会很高的 具体思路 在增加时,如果要加的区间正好覆盖一个 ...

  9. [bzoj2752]高速公路 题解(线段树)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2102  Solved: 887[Submit] ...

随机推荐

  1. Dynamics CRM Performance Issue when CRM Forms Opening

    事情发生在Dynamics CRM 8.2.2版本,客户新升级到这个版本几个月的时间. 突然有一天,客户反映为什么我们打开CRM Form页面的时候loading的时间这么长呢?大概会需要5-15分钟 ...

  2. mui点击蒙版点击蒙版让其不自动关闭

    var mask = mui.createMask(callback);//callback为用户点击蒙版时自动执行的回调: mask.show();//显示遮罩 mask.close();//关闭遮 ...

  3. python 网络爬虫报错“UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position”解决方案

    Python3.x爬虫, 发现报错“UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1:invalid sta ...

  4. python数据处理(七)之数据探索和分析

    1.探索数据 1.1 安装agate库 1.2 导入数据 1.3 探索表函数 a.排序 b.最值,均值 c.清除缺失值 d.过滤 e.百分比 1.4 连结多个数据集 a.捕捉异常 b.去重 c.缺失数 ...

  5. HTTP版本比较

    HTTP2.0优势 1.采用二进制格式传输数据,而非http1.1文本格式,二进制格式在协议的解析和优化扩展上带来了跟多的优势和可能 2.对消息头采用Hpack进行压缩传输,能够节省消息头占用的网络流 ...

  6. 解决redis秒杀超卖的问题

    我们再使用redis做秒杀程序的时候,解决超卖问题,是重中之重.以下是一个思路. 用上述思路去做的话,我们再用户点击秒杀的时候,只需要检测,kucun_count中是否能pop出数据,如果能pop出来 ...

  7. 软件测试大牛都是这样写测试用例的,你get到了嘛?

    1. 用于语句覆盖的基路径法 基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖.基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解即可,不必理解和掌握. ...

  8. Cyber Security - Palo Alto Firewall Security Zones

    Firewall Security Zones Zones: The foundational aspect of every Firewall. Police network traffic Enf ...

  9. 集训作业 洛谷P1433 吃奶酪

    嗯?这题竟然是个绿题. 这个题真的不难,不要被他的难度吓到,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的搜索就可以了. 这个题我用的深搜,因 ...

  10. create-react-app中的babel配置探索

    版本 babel-loader version:"8.1.0" create-react-app:"3.4.1" 三个配置 第一部分: { test: /\.( ...