【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 ...
随机推荐
- ATI显卡添加自定义分辨率
run regedit, 浏览到这个键目录下 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video 先导出一个作为备份. 查找 DALNo ...
- SQL server 数据库备份还原Sql
/************ 一.数据库备份 ************/ --完整备份默认追加到现有的文件 backup database DBXS To disk='d:\backup\DBXS_fu ...
- python install
Install all dependencies by pip install -r requirements.txt (Run this command from project root)
- jboss eap 6.2+ 版本中 加密datasource密码等敏感信息
默认情况下,在jboss eap 6.2+ 管理控制台创建datasource后,会在standalone.xml(独立模式)或host.xml(域模式)中以明文保存相关敏感信息. 这会给服务器留下安 ...
- silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法
环境:英文版vs2010 sp1 + vs2013 RC 90天体验版 原来可以正常做silverilght 4 项目开发,今天因为vs2013 RC过了90天体验期,卸载时顺带把Silverlihg ...
- Web Worker 是什么鬼?
前言 前端工程师们一定有过这样的体验,当一个页面加载了大量的 js 文件时,用户界面可能会短暂地"冻结".这很好理解,因为 js 是单线程的语言.我们再走的极端点,一段 js 中出 ...
- javascript 位运算
位运算博大精深,本文总结下基本的位运算的概念. 1.整数的二进制码 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript中的所有数值都以IEEE-754 64位格式存储 ...
- ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器
ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器一:闲谈一下:1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!! ...
- 【分布式协调器】Paxos的工程实现-cocklebur简介(一)
初识分布式协调器 分布式协调器的“协调”二字让人摸不到头脑,怎么就协调了,用的着协调吗?实际上这个东西在之前就是为了提供分布式锁服务而设计的,伟大的google公司发明了chubby,雅虎随后也推出了 ...
- 正则表达式语法(msdn)
“正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串.该表达式可用作一个将字符模式与要搜索的字符串相匹配的模板. 正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符” ...