【BZOJ-4631】踩气球 线段树 + STL
4631: 踩气球
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 224 Solved: 114
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1 1 1 1
5 5
2 2
1 3
5
4
2
5
2
3
Sample Output
1
1
2
3
【样例说明】
实际上每次操作的盒子是: 4 2 1 3 5
在第二次操作后,第二个熊孩子会高兴 (区间[2,2]中的气球已经全部被踩爆)。
在第四次操作后,第三个熊孩子会高兴(区间[1,3]中的气球已经全部被踩爆)。
在第五次操作后,第一个熊孩子会高兴(区间[5,5]中的气球已经全部被踩爆)。
HINT
Source
Solution
比较好想的一道题
首先对序列建线段树,把M个区间建到线段树上,在线段树的相应节点上记录
维护区间的A[]值和
修改操作相当于单点-1
当一个区间的和=0时更新这个区间上的熊孩子区间的答案,然后统计ans
期望的时间复杂度大概是$O(MlogN)$
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 100010
int N,M,Q,size[MAXN],ans,last,A[MAXN];
struct SegmentTreeNode{int l,r,sum; vector<int>v; }tree[MAXN<<];
inline void Update(int now) {tree[now].sum=tree[now<<].sum+tree[now<<|].sum;}
inline void PushUp(int now)
{
if (tree[now].sum) return;
int len=tree[now].v.size(),l=tree[now].l,r=tree[now].r;
for (int i=; i<=len-; i++)
size[ tree[now].v[i] ]-=r-l+;
for (int i=; i<=len-; i++)
if (!size[ tree[now].v[i] ]) ans++;
tree[now].v.clear();
}
void BuildTree(int now,int l,int r)
{
tree[now].l=l; tree[now].r=r;
if (l==r) {tree[now].sum=A[l]; return;}
int mid=(l+r)>>;
BuildTree(now<<,l,mid);
BuildTree(now<<|,mid+,r);
Update(now); PushUp(now);
}
inline void Change(int now,int pos,int D)
{ int l=tree[now].l,r=tree[now].r;
if (l==r) {tree[now].sum+=D; PushUp(now); return;}
int mid=(l+r)>>;
if (pos<=mid) Change(now<<,pos,D);
if (pos>mid) Change(now<<|,pos,D);
Update(now); PushUp(now);
}
inline void Cover(int now,int L,int R,int id)
{
int l=tree[now].l,r=tree[now].r;
if (L<=l && R>=r) {tree[now].v.push_back(id); size[id]=R-L+; return;}
int mid=(l+r)>>;
if (L<=mid) Cover(now<<,L,R,id);
if (R>mid) Cover(now<<|,L,R,id);
Update(now); PushUp(now);
}
inline int GetX(int x) {return (x+last-)%N+;}
int main()
{
N=read(),M=read();
for (int i=; i<=N; i++) A[i]=read();
BuildTree(,,N);
for (int L,R,i=; i<=M; i++) L=read(),R=read(),Cover(,L,R,i);
Q=read();
for (int x,i=; i<=Q; i++) x=GetX(read()),Change(,x,-),printf("%d\n",last=ans);
return ;
}
总感觉有种不科学的....毕竟就用了10分钟就A了...
【BZOJ-4631】踩气球 线段树 + STL的更多相关文章
- 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次操作,每次从某一个盒子 ...
- [Luogu P4215] 踩气球 (线段树)
题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...
- 【bzoj4631】踩气球 线段树
题解: 真是很zz 我都想到线段树分治的思路了... 不过还是一道好题 首先跟线段树分治一样将区间投射到线段树上去 每次修改如果该个区间修改为0,则对他们对应的特定区间-1 这样每个区间会有一次变0, ...
- BZOJ 4631 踩气球
BZOJ上内存小了会WA.... 线段树上挂链表. #include<iostream> #include<cstdio> #include<cstring> #i ...
- 【BZOJ 4631】4631: 踩气球 (线段树)
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 316 Solved: 153 Description 六一儿童节到了, SHUX ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
随机推荐
- PhpExcel中文帮助手册|PhpExcel使用方法
下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...
- redis-cache中的callback
这个是mybatis/redis-cache中关键类 RedisCache 的源码 /** * Copyright 2015 the original author or authors. * * ...
- 使用Proguard做Java代码混淆
下载Proguard, 我下的是最新的Proguad5.2 在windows下运行bin/proguardgui.bat, 可以看见图形界面, 载入配置, 然后process. 配置文件例子 -inj ...
- Javascript 代码格式化(JsFormat)
JsFormat 在GitHub 上的地址: https://github.com/jdc0589/JsFormat 这是一个sublime text 2 的插件. 安装: 先安装 sublime p ...
- redis 学习笔记(5)-Spring与Jedis的集成
首先不得不服Spring这个宇宙无敌的开源框架,几乎整合了所有流行的其它框架,http://projects.spring.io/spring-data/从这上面看,当下流行的redis.solr.h ...
- Java的性能优化
http://www.toutiao.com/i6368345864624144897/?tt_from=mobile_qq&utm_campaign=client_share&app ...
- PAT 1067. Sort with Swap(0,*)
1067. Sort with Swap(0,*) (25) Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy ...
- (转)RSA算法原理(二)
作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...
- 创业这三年¥.NET之尴尬处境
创业这三年#迈出第一步 创业这三年@各种奇遇 之前写的文章有兴趣的大家可以看看. 本来没有打算写这样一篇会遭人拍砖的文章,但是发现大家每天忙于编码,对市场环境..Net生态没有一个真实.多角度的认识, ...
- Bootstrap系列 -- 3. 段落
一. 段落基本用法 1. 段落使用<p>标签 2. 段落全局使用font-size=14px字体 ..... 更多请使用Firefox 查看 <p> 华盛顿大学和清华大学共同在 ...