解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改

lsum:从这个区间的左端点往右能够找到的最大连续区间;

rsum:从这个区间的右端点往左能够找到的最大连续区间;

msum:表示这整个区间能够找到的最大连续区间;

sum:0表示这个区间还没有被破坏的点,大于0表示这个区间已经有被破坏的点。

接下来过程就是从大的区间逐渐分解小区间,然后逼近要求的点。。

这道题我一开始只记录了整个区间能够找到的最大连续区间,但这样就会有一个问题了,因为把[l,r]区间分解为[l,mid],[mid+1,r]区间,很有可能这个mid在最大连续区间里,这样就理所当然的要记录lsum和rsum了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 50000;
struct Segment
{int l,r;int lsum,rsum,msum,sum;    //sum表示该线段是否被有点被破坏
}tree[maxn<<2];void PushUp(int rt)
{tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;if(tree[rt].sum){if(!tree[rt<<1].sum)tree[rt].lsum = tree[rt<<1].msum + tree[rt<<1|1].lsum;else tree[rt].lsum = tree[rt<<1].lsum;if(!tree[rt<<1|1].sum)tree[rt].rsum = tree[rt<<1|1].msum + tree[rt<<1].rsum;else tree[rt].rsum = tree[rt<<1|1].rsum;tree[rt].msum = max(tree[rt<<1].msum,tree[rt<<1|1].msum);tree[rt].msum = max(tree[rt].msum,tree[rt<<1].rsum + tree[rt<<1|1].lsum);}else{tree[rt].lsum = tree[rt].rsum = tree[rt].msum = tree[rt<<1].msum + tree[rt<<1|1].msum;}
}void build(int rt,int l,int r)
{tree[rt].l = l, tree[rt].r = r;tree[rt].lsum = tree[rt].rsum = tree[rt].msum = 1;tree[rt].sum = 0;if(l == r) return;int mid = (l + r) >> 1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);PushUp(rt);
}void insert(int rt,int t,int val)
{if(tree[rt].l == tree[rt].r){tree[rt].sum = val;if(tree[rt].sum){tree[rt].lsum = tree[rt].rsum = tree[rt].msum = 0;}else{tree[rt].lsum = tree[rt].rsum = tree[rt].msum = 1;}return;}int mid = (tree[rt].l + tree[rt].r) >> 1;if(t <= mid) insert(rt<<1,t,val);else insert(rt<<1|1,t,val);PushUp(rt);
}int query(int rt,int t)
{if(tree[rt].l == tree[rt].r || !tree[rt].msum || !tree[rt].sum){return tree[rt].msum;}int mid = (tree[rt].l + tree[rt].r) >> 1;if(t <= mid){if(t >= mid - tree[rt<<1].rsum + 1)return tree[rt<<1].rsum + tree[rt<<1|1].lsum;else return query(rt<<1,t);}else{if(mid + tree[rt<<1|1].lsum >= t)return tree[rt<<1].rsum + tree[rt<<1|1].lsum;else return query(rt<<1|1,t);}
}int main()
{int n,m;char ch;while(cin >> n >> m){getchar();int id,top = 0,stack[maxn];build(1,1,n);while(m--){cin >> ch;if(ch == 'D'){cin >> id;stack[top++] = id;insert(1,id,1);}else if(ch == 'Q'){cin >> id;cout << query(1,id) << endl;}else if(ch == 'R'){id = stack[--top];insert(1,id,0);}}}return 0;
}

hdu 1540(线段树单点更新 区间合并)相关推荐

  1. hdu4417:线段树单点更新区间求和,离线 Super Mario

    Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...

  2. A - 卿学姐与公主(线段树+单点更新+区间极值)

    A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  3. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  4. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  5. HDU - 1166敌兵布阵+HDU-1754 I Hate It (线段树单点更新——累加/最大值)

    线段树单点更新,模板题 HDU1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

  6. 【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...

    [原创]tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询) 最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不 ...

  7. HDUOJ----1166敌兵布阵(线段树单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. 【HDU - 1540】 Tunnel Warfare (线段树进阶操作 区间合并+ 单点更新+ 最长覆盖区间查询 )

    题干: During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the va ...

  9. YJJ's Salesman HDU - 6447(线段树 单点更新+DP思想)

    YJJ's Salesman 题目链接:HDU - 6447 题意:一个1e9*1e9的地图,要求由(0, 0) -> (1e9, 1e9):只能向下,向右, 向右下移动:地图中有n个点,有宝藏 ...

最新文章

  1. Asp.Net MVC3 简单入门详解过滤器Filter
  2. Windows编程中的映射模式和坐标转换
  3. linux编译ffmepg,在Ubuntu下编译FFmpeg
  4. fastdfs java token_fastdfs 开启 token 防盗链
  5. linux用户名是什么_什么是Linux用户?
  6. linux服务器如何添加sudo用户
  7. Elasticsearch分页解决方案
  8. Helm 3 完整教程(二十三):使用 Files 方法在模板中读取文件内容
  9. codeigniter mysql 存储过程_Codeigniter框架使用Mysql存储过程的例子
  10. 拓端tecdat|Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
  11. dos系统功能调用的屏幕显示字符是( )号调用_linux混杂设备驱动模型分析(字符设备驱动模型使用篇)...
  12. php录音功能,h5做出网页录音功能
  13. Python 爬取拉钩网工作岗位
  14. bus error的解决方法
  15. linux基本操作大全centos7
  16. photoshop发光线条教程集
  17. word无法显示图像计算机可能没有足够的,Word图片显示不出来怎么办 Word图片显空白的解决办法-电脑教程...
  18. 鸿蒙系统有哪些手机可以用,鸿蒙系统手机有哪些型号,鸿蒙系统手机什么时候上市...
  19. 每日java笔试五小题 2020-9-23
  20. FPGA图像处理_查找表的使用(正弦函数的实现)(含源码)

热门文章

  1. 八城联动丨神策 2020 数据驱动用户大会「上海场」10 月 23 日如期而至!
  2. 神策数据斩获大数据星河奖,首发用户行为分析标准
  3. React全家桶环境搭建过程
  4. 单细胞数据初步处理 | drop-seq | QC | 质控 | 正则化 normalization
  5. com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 80 like报错解决
  6. 几分钟了解阿里云云服务器ECS
  7. 史上最全站点降权原因解析
  8. centos平台openstack spice配置
  9. 用R语言分析我的fitbit计步数据
  10. windows 2003 配置dhcp服务器