BZOJ4631 : 踩气球
将所有盒子插入链表,每当一个盒子变空时,从链表里删去它。
查一下它的前驱后继$pre,nxt$,那么$[pre+1,nxt-1]$都是空的。
每次对于$[A,B]$这段都为空,对小朋友按$R$维护线段树,维护区间内$L$的最大值,不断询问$[1,B]$内$L$的最大值,如果$\geq A$则拿出来。
时间复杂度$O(m\log m)$。
#include<cstdio>
#include<algorithm>
#define N 100010
int n,m,q,i,j,a[N],pre[N],nxt[N],c[N],v[262150],ans;
struct P{int l,r;}b[N];
inline bool cmp(const P&a,const P&b){return a.r<b.r;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int merge(int x,int y){return b[x].l>b[y].l?x:y;}
void build(int x,int a,int b){if(a==b){v[x]=a;return;}int mid=(a+b)>>1;build(x<<1,a,mid),build(x<<1|1,mid+1,b);v[x]=merge(v[x<<1],v[x<<1|1]);
}
void change(int x,int a,int b,int c){if(a==b){v[x]=0;return;}int mid=(a+b)>>1;if(c<=mid)change(x<<1,a,mid,c);else change(x<<1|1,mid+1,b,c);v[x]=merge(v[x<<1],v[x<<1|1]);
}
int ask(int x,int a,int b,int d){if(b<=d)return v[x];int mid=(a+b)>>1,t=ask(x<<1,a,mid,d);if(d>mid)t=merge(t,ask(x<<1|1,mid+1,b,d));return t;
}
inline void del(int x){a[x]--;if(a[x])return;int l=pre[x],r=nxt[x];nxt[l]=r,pre[r]=l;r=c[r-1];if(!r)return;while(1){int t=ask(1,1,m,r);if(b[t].l<=l)return;ans++;change(1,1,m,t);}
}
int main(){read(n),read(m);for(i=1;i<=n;i++)read(a[i]),pre[i]=i-1,nxt[i]=i+1;for(i=1;i<=m;i++)read(b[i].l),read(b[i].r);std::sort(b+1,b+m+1,cmp);for(i=1;i<=m;i++)if(b[i].r!=b[i-1].r)for(j=b[i-1].r;j<b[i].r;j++)c[j]=i-1;for(i=b[m].r;i<=n;i++)c[i]=m;build(1,1,m);read(q);while(q--)read(i),del((i+ans-1)%n+1),printf("%d\n",ans);return 0;
}
BZOJ4631 : 踩气球相关推荐
- bzoj4631踩气球
bzoj4631踩气球 题意: 有一个序列和一个区间集合,每次将序列中的一个数-1,求此时集合里有多少个区间和为0.序列大小≤100000,区间数≤100000,操作数≤100000. 题解: 此题解 ...
- BZOJ4631: 踩气球
BZOJ4631: 踩气球 线段树 的 奇幻世界 题解: 在dalao fqk的模拟赛里我自己想出来的! 撒花 撒花 线段树维护气球,把一个孩子拆成若干个线段树上的区间,并放在对应线段树节点的vect ...
- [bzoj4631]踩气球
题目大意 有一个序列,每次将一个位置的数减去1(保证这个数大于0) 有m个区间,每次操作后你都要输出有多少个区间和为0. 强制在线. 线段树搞搞 这m个区间可以被分割到线段树上的log个区间,那我们就 ...
- BZOJ4631 踩气球
每个熊孩子抽象成平面上的一个点,横坐标为左边界,纵坐标为右边界,点权为区间长度,把第x个盒子拿空相当于把以(1,x)为左下角,(x,n)为右上角的矩形内的点减一,答案就是有多少个点等于0,因为每个点最 ...
- 【BZOJ-4631】踩气球 线段树 + STL
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 224 Solved: 114 [Submit][Status][Discuss ...
- 【bzoj4631】踩气球
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 372 Solved: 186 [ Submit][ Status][ Di ...
- bzoj 4631: 踩气球(线段树)
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 375 Solved: 189 [Submit][Status][Discuss ...
- 记萌新赛的命题过程与踩气球过程
从命题环节开始记起吧,踩气球部分放在后半段压轴. 大约$20$天以前,那天早上我刚下火车,得知今年比赛命题组组长是$xiang578$,老师发的命题人员名单中并没有我.出于对命题工作的好奇与热爱,我向 ...
- noj 1142 F 踩气球
Problem F 踩气球 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自 ...
- 【算法实验二】--【回溯法】--踩气球
1142.踩气球 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球 ...
最新文章
- docker核心网络原理详解
- 肝了一个月,终于搞到了 30 页的 Python 进阶面试题
- PHP下用Memcache 实现消息队列
- 数据结构期末复习之散列表的查找
- 如何管理kvm虚拟机的时钟源
- 使用idea开发SpringBoot应用,添加@SpringBootApplication注解时,不能自动提示
- VirtualApp实战之拿到女神朋友圈封面
- 在手机上实现实时的单眼3D重建
- python GUI打开文本文件代码
- IDEA删除文件如何恢复
- python.exe无法找到入口
- python爬虫网页脚本_python网络爬虫之Scrapy
- java微服务Nacos配置管理
- D3D初学入门一(配置开发环境及绘制D3D窗口)
- 转载的一篇存储图片等信息的还不错的文章
- 简要视音频发展编年史
- 拼多多店铺怎么做产品
- 使用python采集某二手房源数据并做数据可视化展示(含完整源代码)
- CentOS(/dev/mapper/centos-root)进行磁盘扩容
- 超详细的Sentinel入门