[Luogu P4215] 踩气球 (线段树)
题面
传送门:https://www.luogu.org/problemnew/show/P4215
Solution
这题十分有意思。
首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出。(虽然这题推不出)
我们可以明确一点,一个熊孩子开心的时间是满足二分的要求的(如果他某个时刻开心了,那之后的时刻都会保持开心)。
对于判断一个区间是否为全0,我们可以用主席树以一个log的代价来判断。
得到每个熊孩子开心的时刻之后,我们就可以直接前缀和解决问题了。
时间复杂度O(m*log^2)
很可惜,这题强制在线。
很可惜*2,刚刚的做法跟正解一点关系都没有。
我们可以考虑用线段树。
问题是怎么判断一个熊孩子在某个操作后是否开心呢?
我们显然可以快速地判断线段树上的一个直接的区间(即这个区间可以用一个节点表示)是否全为0,问题是我们不能很快地判断一个非直接的区间是否全为0。
所以说,我们可以考虑把熊孩子“拆开”。
因为一个熊孩子的区间一定可以表示为线段树上的几个直接区间,我们可以在这些直接区间上打上标记,记录这个区间被哪几个熊孩子直接包含。
我们再记录一下每个熊孩子被拆成了几个区间。
一个区间全部变为0的时候,我们把它对应的熊孩子的记录值-1,当一个熊孩子记录值为0的时候,就代表着这个熊孩子的区间被彻底干掉了。
时间复杂度O(mlogn+qlogn)
就酱,这题就被我们切掉啦φ(>ω<*)
Code
//Luogu P4215 踩气球
//Oct,14th,2018
//有意思的线段树
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=100000+100;
int ans,tot[N];
struct SegmentTree
{
#define lson (now<<1)
#define rson (now<<1|1)
#define mid ((now_l+now_r)/2)
vector <int> son[N<<2];
int IsClear[N<<2],cnt[N];
inline void update(int now)
{
IsClear[now]=IsClear[lson]&IsClear[rson];
}
void Mark(int L,int R,int x,int now,int now_l,int now_r)
{
if(now_l>=L and now_r<=R)
{
tot[x]++;
son[now].push_back(x);
return;
}
if(L<=mid) Mark(L,R,x,lson,now_l,mid);
if(R>mid) Mark(L,R,x,rson,mid+1,now_r);
}
void Sub(int x,int now,int now_l,int now_r)
{
if(now_l==now_r)
{
cnt[x]--;
if(cnt[x]==0)
IsClear[now]=true;
}
if(now_l!=now_r)
{
if(x<=mid) Sub(x,lson,now_l,mid);
else Sub(x,rson,mid+1,now_r);
update(now);
}
if(IsClear[now]==true)
for(int i=0;i<int(son[now].size());i++)
{
tot[son[now][i]]--;
if(tot[son[now][i]]==0)
ans++;
}
}
#undef lson
#undef rson
#undef mid
}sgt;
int n,m,q;
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
sgt.cnt[i]=read();
for(int i=1;i<=m;i++)
{
int L=read(),R=read();
sgt.Mark(L,R,i,1,1,n);
} int q=read(),lans=0;
for(int i=1;i<=q;i++)
{
int x=read();
x=(x+lans-1)%n+1;
sgt.Sub(x,1,1,n);
lans=ans;
printf("%d\n",lans);
}
return 0;
}
[Luogu P4215] 踩气球 (线段树)的更多相关文章
- 【BZOJ-4631】踩气球 线段树 + STL
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 224 Solved: 114[Submit][Status][Discuss] ...
- 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次操作,每次从某一个盒子 ...
- 【bzoj4631】踩气球 线段树
题解: 真是很zz 我都想到线段树分治的思路了... 不过还是一道好题 首先跟线段树分治一样将区间投射到线段树上去 每次修改如果该个区间修改为0,则对他们对应的特定区间-1 这样每个区间会有一次变0, ...
- NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树
题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...
- hdu 1556 涂气球 线段树(区间更新~对区间[x,y]更新,求任意节点被更新的次数)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- luogu P4198 楼房重建——线段树
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
- Luogu 3369 我用线段树骗了一道平衡树题……
这篇博客毫无意义-- 只是表达一下我仍然会写树状数组和线段树-- 题目链接 #include <cstdio> #include <cstring> #include < ...
- [Luogu P4198]楼房重建(线段树)
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...
随机推荐
- 日志分析平台ELK之日志收集器logstash
前文我们聊解了什么是elk,elk中的elasticsearch集群相关组件和集群搭建以及es集群常用接口的说明和使用,回顾请查看考https://www.cnblogs.com/qiuhom-187 ...
- Spring循环依赖的问题
什么是循环依赖?就是两个Bean相互引用,比如用@Autowire 相互注入. 那么Spring是如何解决这个问题的呢?在Bean还未完全实例化前(类只实例化了一部分),将bean提前暴露出来 ...
- interp1一维数据插值在matlab中的用法
转载:https://ww2.mathworks.cn/help/matlab/ref/interp1.html?s_tid=srchtitle#btwp6lt-2_1 interp1 一维数据插值( ...
- 6个LED的控制
控制任务和要求 让6个LED按要求工作 电路设计 程序设计 1 int Led1 = 1; //各LED与实验板的联接引脚 2 int Led2 = 2; 3 int Led3 = 3; 4 int ...
- Mac Idea你不知道的秘密
导读 工欲善其事必先利其器,日常工作中,知道这些Idea技巧,可以极大提高日常开发效率. 技巧篇 以下内容不分先后顺序 显示类中的方法 搜索 搜索方法,按两下shift 文字搜索,control+sh ...
- 用c语言实现linux cat
话不多说,直接上代码: #include <stdio.h> void file_copy(FILE * file1,FILE * file2); int main(int argc,ch ...
- git克隆指定分支到本地
我们每次使用命令 git clone https://xxx.com/android-app.git 默认 clone 的是这个仓库的 master 分支. 使用Git下载指定分支命令为:git cl ...
- golang 语言的特性
给函数传递参数的时候 map.slice.channel是按引用传递的 同一个变量不能用 := 这种方式创建并赋值两次. 一个包(package)的func .结构体类型变量如果要被外部的包调用.fu ...
- java高级&资深&专家面试题-行走江湖必备-持续更新ing
行走江湖必备一份面试题,这里给大家整理了一套.0面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同 ...
- 【小白学PyTorch】21 Keras的API详解(下)池化、Normalization层
文章来自微信公众号:[机器学习炼丹术].作者WX:cyx645016617. 参考目录: 目录 1 池化层 1.1 最大池化层 1.2 平均池化层 1.3 全局最大池化层 1.4 全局平均池化层 2 ...