bzoj4631踩气球

题意:

有一个序列和一个区间集合,每次将序列中的一个数-1,求此时集合里有多少个区间和为0。序列大小≤100000,区间数≤100000,操作数≤100000。

题解:

此题解法其实并不难,对序列建线段树,用线段树每个节点维护区间和及覆盖该区间的集合内的区间的链表,同时记录每个集合内区间被分割为多少个区间。操作时就把查询经过的节点的区间和-1,如果为0则将覆盖该节点的区间的分割数-1,当分割数为0就让答案++。问题是复杂度,总是要遍历链表不会很慢吗?后来仔细想了一下,每次向线段树挂区间时最多挂log2n个节点,共影响到mlog2n个节点,因此遍历链表的总节点数为mlog2n,且当一个节点区间和变为0遍历链表后就永远不会再遍历,因此总复杂度大致是O(mlog2n)。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define inc(i,j,k) for(int i=j;i<=k;i++)
 5 #define maxn 100100
 6 using namespace std;
 7
 8 struct nd{int v,n;}; nd nds[maxn*50]; int v[maxn*4],tot[maxn],g[maxn*4],n,m,a[maxn],q,ans,ndss;
 9 inline int read(){
10     char ch=getchar(); int f=1,x=0;
11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
12     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
13     return f*x;
14 }
15 void ins(int num,int node){
16     nds[++ndss]=(nd){num,g[node]}; g[node]=ndss;
17 }
18 void update(int x){
19     for(int i=g[x];i;i=nds[i].n){tot[nds[i].v]--; if(!tot[nds[i].v])ans++;}
20 }
21 void build(int x,int l,int r){
22     if(l==r){v[x]=a[l]; return;}; int mid=l+r>>1;
23     build(x<<1,l,mid); build(x<<1|1,mid+1,r); v[x]=v[x<<1]+v[x<<1|1];
24 }
25 void insert(int x,int l,int r,int ql,int qr,int num){
26     if(ql<=l&&r<=qr){ins(num,x); tot[num]++; return;} int mid=l+r>>1;
27     if(ql<=mid)insert(x<<1,l,mid,ql,qr,num); if(mid<qr)insert(x<<1|1,mid+1,r,ql,qr,num);
28 }
29 void change(int x,int l,int r,int q){
30     v[x]--; if(!v[x])update(x); if(l==r)return; int mid=l+r>>1;
31     if(q<=mid)change(x<<1,l,mid,q);else change(x<<1|1,mid+1,r,q);
32 }
33 int main(){
34     //freopen("in.txt","r",stdin);
35     n=read(); m=read(); inc(i,1,n)a[i]=read(); build(1,1,n);
36     inc(i,1,m){int l=read(),r=read(); insert(1,1,n,l,r,i);} q=read();
37     inc(i,1,q){int x=(read()+ans-1)%n+1; change(1,1,n,x); printf("%d\n",ans);}
38     return 0;
39 }

20160723

转载于:https://www.cnblogs.com/YuanZiming/p/5699496.html

bzoj4631踩气球相关推荐

  1. BZOJ4631: 踩气球

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

  2. [bzoj4631]踩气球

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

  3. BZOJ4631 踩气球

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

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

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

  5. 【bzoj4631】踩气球

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

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

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

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

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

  8. noj 1142 F 踩气球

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

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

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

最新文章

  1. 打印速度快点的打印机_佳能和爱普生打印机哪个好 高性价比打印机介绍【详解】...
  2. JavaScript 经常忽略的 7 个基础知识点
  3. python实现Matlab中的circshift函数
  4. 【CASS精品教程】CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总
  5. 中webgl解析json_WebGL蒙皮(下)
  6. 平行四边形的特殊性质
  7. 【误区】技术部经理vs技术经理 —— 一字之差谬以千里
  8. lucene可用中文分词IKAnalyzer,maven pom下载代码及配置文件
  9. Git和码云项目平台使用文档
  10. matlab——取整函数
  11. 需求分层-KANO模型解读
  12. 位运算bitwise_and函数
  13. 一套开源三维管线管理系统
  14. ModuleNotFoundError: No module named ‘kombu.five‘
  15. Vulnhub靶场之symfonos:1
  16. IO赛制神器——对拍
  17. ASO 相似测试
  18. DoIP的基本信息(一)
  19. 基于bim技术的应用软件有哪些?提高bim工作效率的revit插件?
  20. Onion-Peel Networks for Deep Video Completion

热门文章

  1. 自学python还是报班-转行Python开发自学还是报班?老男孩全日制学习
  2. 函数式编程语言python-Python函数式编程
  3. python导入excel数据-python + Excel数据读取(更新)
  4. Zookeeper知识学习
  5. 面向对象第四单元总结
  6. zh-cn 与 zh-hans 是什么关系、有什么区别
  7. struts2拦截器的实现原理及源码剖析
  8. 235 Lowest Common Ancestor of a Binary Search Tree
  9. 开源Math.NET基础数学类库使用(11)C#计算相关系数
  10. Android核心分析之二十三Andoird GDI之基本原理及其总体框架