poj 3667

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cctype>
 5 using namespace std;
 6 #define lson l,m,rt<<1
 7 #define rson m+1,r,rt<<1|1
 8
 9 const int maxn=55555;
10
11 //c初始化为-1是因为传值的时候可能有两种情况,一种是清空的情况,另一种是
12 //住宿的情况,清空时借用0把下标传到子区间,而住宿的时候把1传到子区间
13 int lsum[maxn<<2],rsum[maxn<<2],msum[maxn<<2];
14 int cover[maxn<<2];
15 //做区间永远>=右区间
16 void Pushdown(int rt,int m){
17     if(cover[rt]!=-1){
18         cover[rt<<1]=cover[rt<<1|1]=cover[rt];
19         msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=cover[rt]?0:m-(m>>1);
20         //这不就是直接等于m吗?不是,因为如果是0的话,就是0.
21         msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=cover[rt]?0:(m>>1);
22         cover[rt]=-1;
23     }
24 }
25 void Pushup(int rt,int m){
26     lsum[rt]=lsum[rt<<1];
27     rsum[rt]=rsum[rt<<1|1];
28     if(lsum[rt]==m-(m>>1)) lsum[rt]+=lsum[rt<<1|1];
29     if(rsum[rt]==(m>>1)) rsum[rt]+=rsum[rt<<1];
30     msum[rt]=max(lsum[rt<<1|1]+rsum[rt<<1],max(msum[rt<<1],msum[rt<<1|1]));
31 }
32
33 void build(int l,int r,int rt){
34     msum[rt]=lsum[rt]=rsum[rt]=r-l+1;
35     cover[rt]=-1;
36     if(l==r) return;
37     int m=(l+r)>>1;
38     build(lson);
39     build(rson);
40 }
41
42 int query(int w,int l,int r,int rt){
43     //之所以会直接返回1,是因为在输入进来的时候判了可以取吗?
44     //如果取不到直接都进不来
45     if(l==r) return 1;
46     Pushdown(rt,r-l+1);
47     int m=(l+r)>>1;
48     if(msum[rt<<1]>=w) return query(w,lson);
49     else if(rsum[rt<<1]+lsum[rt<<1|1]>=w) return m-rsum[rt<<1]+1;
50     return query(w,rson);
51 }
52
53 void update(int L,int R,int c,int l,int r,int rt){
54     if(L<=l&&r<=R){
55         //如果全部都涵盖了,那么一定都更新
56         msum[rt]=lsum[rt]=rsum[rt]=c?0:r-l+1;
57         cover[rt]=c;
58         return;
59     }
60     Pushdown(rt,r-l+1);
61     int m=(l+r)>>1;
62     if(L<=m) update(L,R,c,lson);
63     if(m<R) update(L,R,c,rson);
64     Pushup(rt,r-l+1);
65 }
66 int main(){
67     int n,m;
68     scanf("%d%d",&n,&m);
69     build(1,n,1);
70     int op,a,b;
71     while(m--){
72         scanf("%d",&op);
73         if(op==1){
74             scanf("%d",&a);
75             if(msum[1]<a) printf("0\n");
76             else{
77                 int p=query(a,1,n,1);
78                 printf("%d\n",p );
79                 update(p,p+a-1,1,1,n,1);
80             }
81         }else{
82             scanf("%d%d",&a,&b);
83             update(a,a+b-1,0,1,n,1);
84         }
85     }
86     return 0;
87 }

转载于:https://www.cnblogs.com/Msmw/p/11270412.html

线段树——区间合并(模板题)相关推荐

  1. HDU - 2871 Memory Control(线段树+区间合并)好题!

    题目链接:点击查看 题目大意:给定n个内存和m个操作,分别是: New x:从内存编号1开始向右查找,分配一个长度为x的空间,若找到输出区间的首地址,否则输出Reject New: Free x:释放 ...

  2. CodeForces - 1539F Strange Array(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...

  3. 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

    传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...

  4. HDU1540(线段树区间合并)

    很经典的一道题,线段树区间合并非常好的一道入门题,每个节点保存区间连续1的最大左串长度,最大右串长度,以及区间最大长度(常规的三种信息维护),更新操作时注意push_up函数,针对不同的问题,push ...

  5. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  6. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  7. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  8. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  9. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  10. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

最新文章

  1. linux 内存居高不下,Linux 内存占用总是很高为何依旧很流畅?
  2. Python--strip()学习记录
  3. 剑指offer(12)旋转数组的最小数字
  4. 软件工程15 个人阅读作业1
  5. 后端用的nodejs怎么打包_你怎么也想象不到,平板玻璃、玻璃瓶这些竟可以用PET塑钢带打包!...
  6. iOS 操作系统被曝无线网络命名bug 导致 iPhone无法连接无线网络
  7. chmod 777命令_Linux用户权限管理及用户权限管理命令操作
  8. Effective C++ 读书笔记之Part6.Inheritance and Object-Oriented Design
  9. 加权平均成本计算公式
  10. 计算机科学导论任务书,计算机科学导论论文提纲格式范文 计算机科学导论论文提纲如何写...
  11. 【历史上的今天】1 月 23 日:现代集成电路雏形;JDK 1.0 发布;数学大师诞生
  12. Linux搭建小型服务器——文件共享以及邮件服务器
  13. 腾讯一面+二面+三面+HR面
  14. 使用yum下载文件报No module named urlgrabber.grabber错
  15. Web答辩问题整合一
  16. 1. 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目
  17. js中事件绑定3种方法以及事件委托
  18. Linux使用shell定时任务实现ffmpeg视频转码和截图
  19. 软件测试49个必问面试题合集+答案
  20. 学习UI设计后的就业岗位、薪资大揭秘!

热门文章

  1. 财务自由之路笔记 第一章 你真正想要什么
  2. PHP 图片转base64编码 和 base64编码字符串转换成图片保存
  3. python调用r语言加载包错误_Python调用R语言
  4. 知识点滴 - X射线和伽马射线有什么区别?
  5. 元器件温度系数(ppm/℃)是什么?
  6. C# 处理PPT水印(二)——去除水印效果(文本水印、图片水印)
  7. Codeforces Global Round 21 C. Fishingprince Plays With Array
  8. t480s控制面板打开触摸板_今年买的thinkpad T480S,但是使用感觉还不如5年前买的S3 touch速度快,是什么原因?...
  9. 通过Web Service实现IP地址查询功能
  10. 《深入理解分布式事务》,初识分布式......