题目链接

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

题目大意:给定一个长度为$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)$。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,q,m,a[],ans;
struct node
{
vector<int> v;
int l,r,val;
}tree[];
struct Node
{
int l,r,s;
}t[];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void build(int index,int l,int r)
{
tree[index].l=l;
tree[index].r=r;
if (l==r)
{
tree[index].val=a[l];
return;
}
int mid=(l+r)>>;
build(index*,l,mid);
build(index*+,mid+,r);
tree[index].val=tree[index*].val+tree[index*+].val;
}
inline void update(int index,int pos,int v)
{
if (tree[index].l==tree[index].r)
{
tree[index].val+=v;
if (tree[index].val==)
{
for (int i=;i<tree[index].v.size();i++)
{
t[tree[index].v[i]].s--;
if (t[tree[index].v[i]].s==) ans++;
}
}
return;
}
int mid=(tree[index].l+tree[index].r)>>;
if (pos<=mid) update(index*,pos,v);
else update(index*+,pos,v);
tree[index].val=tree[index*].val+tree[index*+].val;
if (tree[index].val==)
{
for (int i=;i<tree[index].v.size();i++)
{
t[tree[index].v[i]].s--;
if (t[tree[index].v[i]].s==) ans++;
}
}
}
inline void split(int index,int l,int r,int id)
{
if (l<=tree[index].l&&tree[index].r<=r)
{
tree[index].v.push_back(id);
t[id].s++;
return;
}
int mid=(tree[index].l+tree[index].r)>>;
if (l<=mid) split(index*,l,r,id);
if (r>mid) split(index*+,l,r,id);
}
int main()
{
n=read(),m=read();
for (int i=;i<=n;i++) a[i]=read();
build(,,n);
for (int i=;i<=m;i++) t[i].l=read(),t[i].r=read();
for (int i=;i<=m;i++) split(,t[i].l,t[i].r,i);
q=read();
while(q--)
{
int x=read();
x=(x+ans-)%n+;
update(,x,-);
printf("%d\n",ans);
}
return ;
}

【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. Jetbranis学习资料之全家桶

    相信很多小伙伴,用的代码编辑器很多都是Jetbrains的,但好东西不可能免费的,而且找了很多激活码都是失效总是莫名其妙的就过期了.下面分享一个不错的激活码地址,比其他的应该更加可靠.本人实测目前支持 ...

  2. YAML 语言教程与使用案例

    YAML语言教程与使用案例,如何编与读懂写YAML文件. YAML概要 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写.在开发的这种 ...

  3. Idea JAVA开发工具快速上手-常用快捷键汇总

    前言: 之前一直使用Eclipse 系列开发IDE工具,由于eclipse是开源的所以,一般情况,eclipse基本上每一个java入门者的首选开发工具,其次 Myeclipse.不过现在越来越多的人 ...

  4. Maven 专题(二):vscode 创建一个java Maven项目(vscode)以HdfsClientDemo 为例

    1.打开vs code软件,最好创建好自己的工程并使用vs code打开   2. 使用快捷键ctrl + shift + p按键,输入maven进行搜索,选中如图诉讼hi的create mavene ...

  5. python生成器原理剖析

    python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...

  6. scrapy 源码解析 (五):启动流程源码分析(五) Scraper刮取器

    Scraper刮取器 对ExecutionEngine执行引擎篇出现的Scraper进行展开.Scraper的主要作用是对spider中间件进行管理,通过中间件完成请求.响应.数据分析等工作. Scr ...

  7. Cordova总是弹出Connection to server was Unsuccessful

    开发环境:Cordova版本:6.x 安卓版本:6.0 解决方案一: 在config.xml中添加以下内容: <preference name="LoadUrlTimeoutValue ...

  8. Ethical Hacking - NETWORK PENETRATION TESTING(18)

    Session Hijacking What if the user uses the "remember me" feature? If the user uses this f ...

  9. P4017 最大食物链计数 (拓扑排序)

    看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2  入度为2…… for循环 找到秃头 5 ...

  10. sqlserver——merge用法

    merge集插入,更新,删除于一体,如果要对一个表同时进行插入,更新,删除2个或3三个操作.效率要高于单个操作. merge into tableb b --被操作表using (select id, ...