【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=\ ...
随机推荐
- 《HTML5编程之旅》系列三:WebSockets 技术解析
本文主要研究HTML5 WebSockets的使用方法,它是HTML5中最强大的通信功能,定义了一个全双工的通信信道,只需Web上的一个Socket即可进行通信,能减少不必要的网络流量并降低网络延迟. ...
- 为什么 .NET 会被叫做 .NET?
微软开发.NET Framework是在20世纪90年代后期,最初是叫做“下一代Windows服务”(Next Generation Windows Services 简称 NGWS). 那么为什么微 ...
- 【BZOJ】2820: YY的GCD
[题意]给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对.T<=10^4,N,M<=10^7. [算法]数论(莫比乌 ...
- gcc 随笔
将几个文件编译成一个动态库 libtest.so gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 将test.c与动态库libte ...
- 二. Jmeter--关联
1. 首先建立一个线程组(Thread Group),为什么所有的请求都要加入线程组这个组件呢?不加不行吗?答案当然是不行的.因为jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建 ...
- PyQt:eg4
import sys from PyQt4 import QtCore from PyQt4 import QtGui class Form(QtGui.QDialog): def __init__( ...
- ansible报错AttributeError: module 'urllib.request' has no attribute 'HTTPSHandler'
报错内容: TASK [activemq : extract activemq tarball] *************************************************** ...
- word2vec参数
架构:skip-gram(慢.对罕见字有利)vs CBOW(快) · 训练算法:分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利) 负例采样准确率提高,速度会慢, ...
- Otto:EventBus
Otto:EventBus 2014年6月20日 星期五 15:14 参考: http://www.mythroad.net/?p=4151 Otto 是Android系统的一个Event Bus模式 ...
- Jmeter中的逻辑控制器(四)
Jmeter中的逻辑控制器 (Logic Controller) [线程组]右键—>[添加]—>[逻辑控制器] 简单控制器(Simple Controller ) 没有特殊功能,目的是形成 ...