【BZOJ 4631】4631: 踩气球 (线段树)
4631: 踩气球
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 316 Solved: 153Description
六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球。SHUXK 要进行Q次操作,每次从某一个盒子里拿出一个没被踩爆的气球,然后熊孩子们就会立刻把它踩爆。这M个熊孩子每个人都指定了一个盒子区间[Li, Ri]。 如果某一个时刻,一个熊孩子发现自己选定的盒子区间[Li, Ri]中的所有气球都已经被踩爆了,他就会非常高兴(显然之后他一直会很高兴)。为了不辜负将自己的任务强行塞给 SHUXK 的那个人的期望, SHUXK 想向你询问:他每次操作过后会有多少个熊孩子很高兴。Input
第一行包含两个正整数N和M,分别表示盒子和熊孩子的个数。第二行包含N个正整数Ai( 1 < = Ai < = 10^5),表示每个盒子里气球的数量。以下M行每行包含两个正整数Li, Ri( 1 < = Li < = Ri < = N),分别表示每一个熊孩子指定的区间。以下一行包含一个正整数Q,表示 SHUXK 操作的次数。以下Q行每行包含一个正整数X,表示这次操作是从第X个盒子里拿气球。为了体现在线,我们对输入的X进行了加密。假设输入的正整数是x',那么真正的X = (x' + Lastans − 1)Mod N + 1。其中Lastans为上一次询问的答案。对于第一个询问, Lastans = 0。输入数据保证1 < = x' < = 10^9, 且第X个盒子中有尚未被踩爆的气球。N < = 10^5 ,M < = 10^5 �,Q < = 10^5Output
包含Q行,每行输出一个整数,表示 SHUXK 一次操作后询问的答案。答案的顺序应与输入数据的顺序保持一致。Sample Input
5 3
1 1 1 1 1
5 5
2 2
1 3
5
4
2
5
2
3Sample Output
0
1
1
2
3
【样例说明】
实际上每次操作的盒子是: 4 2 1 3 5
在第二次操作后,第二个熊孩子会高兴 (区间[2,2]中的气球已经全部被踩爆)。
在第四次操作后,第三个熊孩子会高兴(区间[1,3]中的气球已经全部被踩爆)。
在第五次操作后,第一个熊孩子会高兴(区间[5,5]中的气球已经全部被踩爆)。HINT
Source
【分析】
我觉得这个跟扫描线的线段树维护是有异曲同工之妙的。
把线段树上覆盖熊孩子区间的点标记。当这个点全部被清0的时候让cnt--,当熊孩子的log个区间减剩0,ans++。
看代码易懂。
【可以思考一下操作变成区间的时候怎么办
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 2000010
#define INF 0xfffffff
#define LL long long int a[Maxn]; struct node
{
int l,r,lc,rc;
}tr[Maxn*]; int tot;
LL sm[Maxn],ss[Maxn];
int build(int l,int r)
{
int x=++tot;
tr[x].l=l;tr[x].r=r;
ss[x]=sm[r]-sm[l-];
if(l<r)
{
int mid=(l+r)>>;
tr[x].lc=build(l,mid);
tr[x].rc=build(mid+,r);
}
else tr[x].lc=tr[x].rc=;
return x;
} int first[Maxn],nt[Maxn],cnt[Maxn],tto[Maxn];
int len;
void add(int x,int id)
{
tto[++len]=id;nt[len]=first[x];first[x]=len;cnt[id]++;
} void ins(int x,int l,int r,int id)
{
if(tr[x].l==l&&tr[x].r==r)
{
add(x,id);return;
}
int mid=(tr[x].l+tr[x].r)>>;
if(r<=mid) ins(tr[x].lc,l,r,id);
else if(l>mid) ins(tr[x].rc,l,r,id);
else {ins(tr[x].lc,l,mid,id);ins(tr[x].rc,mid+,r,id);}
} int ans;
void solve(int x)
{
for(int i=first[x];i;i=nt[i])
{
int y=tto[i];
cnt[y]--;
if(cnt[y]==) ans++;
}
} void change(int x,int y)
{
ss[x]--;
if(ss[x]==) solve(x);
if(tr[x].l==tr[x].r) return;
int mid=(tr[x].l+tr[x].r)>>;
if(y<=mid) change(tr[x].lc,y);
else change(tr[x].rc,y);
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
sm[]=;
for(int i=;i<=n;i++) sm[i]=sm[i-]+a[i];
build(,n);
memset(first,,sizeof(first));
for(int i=;i<=m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
ins(,l,r,i);
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int x;scanf("%d",&x);
x=(x+ans-)%n+;
change(,x);
printf("%d\n",ans);
}
return ;
}
2017-04-10 14:37:10
【BZOJ 4631】4631: 踩气球 (线段树)的更多相关文章
- bzoj 4631: 踩气球 线段树合并
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 265 Solved: 136[Submit][Status][Discuss] ...
- bzoj 4631: 踩气球 线段树
题目: Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操作,每次从某一个盒子 ...
- 【BZOJ-4631】踩气球 线段树 + STL
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 224 Solved: 114[Submit][Status][Discuss] ...
- [Luogu P4215] 踩气球 (线段树)
题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...
- 【bzoj4631】踩气球 线段树
题解: 真是很zz 我都想到线段树分治的思路了... 不过还是一道好题 首先跟线段树分治一样将区间投射到线段树上去 每次修改如果该个区间修改为0,则对他们对应的特定区间-1 这样每个区间会有一次变0, ...
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- bzoj 1537: [POI2005]Aut- The Bus 线段树
bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
随机推荐
- js父页面和子页面相互取值
iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 父页面parent.html <html> <head& ...
- 【leetcode 简单】第四十二题 阶乘后的零
给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 ...
- NYOJ 93 汉诺塔 (数学)
题目链接 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片 ...
- docker 镜像导入和导出
使用 docker commit 即可把这个容器变为一个镜像 docker commit 8d93082a9ce1 ubuntu:myubuntu 这时候 docker 容器会被创建为一个新的 Ubu ...
- ORACLE ASM中查询表空间使用情况、数据文件路径、裸设备磁盘总大小剩余大小
在ASM中:查询所有磁盘名称.总大小.剩余大小:单位MB-----查看组的信息(总大小)select name,total_mb, free_mb from v$asm_diskgroup; ---查 ...
- ProxySQL 监控和统计
ProxySQL 监控和统计 很多有价值的统计数据在stats和monitor库中. admin@127.0.0.1 [(none)]>SHOW TABLES FROM stats; +---- ...
- python 异常知识点
raise from python 在3.0 之后引入了raise from 表达式: raise exception from otherexception 当使用该语法时,第二个表达式指定了另一个 ...
- 一个带重试次数的curl 函数
<?php/** * [curl 带重试次数] * @param [type] $url [访问的url] * @param [type] $post [$POST参数] * @param in ...
- js获取系统时间
//------------------------------------获取系统日期时间 var oDate=new Date(); //alert(oDate.getFullYear());// ...
- hive学习(五) 应用案例
1.实现struct数据结构例子 1.1创建student表 create table student( id int, info struct<name:string,age:int> ...