将所有盒子插入链表,每当一个盒子变空时,从链表里删去它。

查一下它的前驱后继$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 : 踩气球相关推荐

  1. bzoj4631踩气球

    bzoj4631踩气球 题意: 有一个序列和一个区间集合,每次将序列中的一个数-1,求此时集合里有多少个区间和为0.序列大小≤100000,区间数≤100000,操作数≤100000. 题解: 此题解 ...

  2. BZOJ4631: 踩气球

    BZOJ4631: 踩气球 线段树 的 奇幻世界 题解: 在dalao fqk的模拟赛里我自己想出来的! 撒花 撒花 线段树维护气球,把一个孩子拆成若干个线段树上的区间,并放在对应线段树节点的vect ...

  3. [bzoj4631]踩气球

    题目大意 有一个序列,每次将一个位置的数减去1(保证这个数大于0) 有m个区间,每次操作后你都要输出有多少个区间和为0. 强制在线. 线段树搞搞 这m个区间可以被分割到线段树上的log个区间,那我们就 ...

  4. BZOJ4631 踩气球

    每个熊孩子抽象成平面上的一个点,横坐标为左边界,纵坐标为右边界,点权为区间长度,把第x个盒子拿空相当于把以(1,x)为左下角,(x,n)为右上角的矩形内的点减一,答案就是有多少个点等于0,因为每个点最 ...

  5. 【BZOJ-4631】踩气球 线段树 + STL

    4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 224  Solved: 114 [Submit][Status][Discuss ...

  6. 【bzoj4631】踩气球

    4631: 踩气球 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 372   Solved: 186 [ Submit][ Status][ Di ...

  7. bzoj 4631: 踩气球(线段树)

    4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 375  Solved: 189 [Submit][Status][Discuss ...

  8. 记萌新赛的命题过程与踩气球过程

    从命题环节开始记起吧,踩气球部分放在后半段压轴. 大约$20$天以前,那天早上我刚下火车,得知今年比赛命题组组长是$xiang578$,老师发的命题人员名单中并没有我.出于对命题工作的好奇与热爱,我向 ...

  9. noj 1142 F 踩气球

    Problem F 踩气球 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自 ...

  10. 【算法实验二】--【回溯法】--踩气球

    1142.踩气球 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球 ...

最新文章

  1. docker核心网络原理详解
  2. 肝了一个月,终于搞到了 30 页的 Python 进阶面试题
  3. PHP下用Memcache 实现消息队列
  4. 数据结构期末复习之散列表的查找
  5. 如何管理kvm虚拟机的时钟源
  6. 使用idea开发SpringBoot应用,添加@SpringBootApplication注解时,不能自动提示
  7. VirtualApp实战之拿到女神朋友圈封面
  8. 在手机上实现实时的单眼3D重建
  9. python GUI打开文本文件代码
  10. IDEA删除文件如何恢复
  11. python.exe无法找到入口
  12. python爬虫网页脚本_python网络爬虫之Scrapy
  13. java微服务Nacos配置管理
  14. D3D初学入门一(配置开发环境及绘制D3D窗口)
  15. 转载的一篇存储图片等信息的还不错的文章
  16. 简要视音频发展编年史
  17. 拼多多店铺怎么做产品
  18. 使用python采集某二手房源数据并做数据可视化展示(含完整源代码)
  19. CentOS(/dev/mapper/centos-root)进行磁盘扩容
  20. 超详细的Sentinel入门

热门文章

  1. 河北海格里斯HEGERLS仓储货架标准解析|配合叉车作业的辅助设备钢制托盘
  2. ffmpeg打开视频文件
  3. uCOSii消息邮箱管理
  4. ehcache增加cache域的两种方式
  5. 如何搭建部署alertmanager高可用集群?
  6. 红帽8.2 Linux学习2
  7. 发作性睡病的发生率是多少?
  8. iOS工作记录11:提现功能 绑定淘宝账号功能
  9. n个人围成一圈指针c语言,用C语言编写:有n个人围成一圈,顺序排号...
  10. 适合程序员的耳机_为什么程序员写代码时喜欢戴耳机?