很经典的一道题,线段树区间合并非常好的一道入门题,每个节点保存区间连续1的最大左串长度,最大右串长度,以及区间最大长度(常规的三种信息维护),更新操作时注意push_up函数,针对不同的问题,push_up写法不同,但都是将左右儿子区间的信息整合到大区间上,本题的一个思维点是对每一个位置,输出他所在的最长1串长度,只要该点被它所在的最大串所覆盖,就直接返回这个最大串长度,否则左儿子或右儿子向下查询。
注意点:多组输入多组输入,在这个点上WA了好几次

#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID(a,b) (a+((b-a)>>1))
const int maxn=1e5+10;
struct node{int l,r,lmx,rmx,val;//val为区间最大连续0个数 int mid(){return MID(l,r);}int len(){return r-l+1;}void init(int v){lmx=rmx=val=v;}
};struct Segtree{node tree[maxn<<2];void push_up(int rt){tree[rt].lmx=tree[ls].lmx;tree[rt].rmx=tree[rs].rmx;tree[rt].val=max(max(tree[ls].val,tree[rs].val),tree[ls].rmx+tree[rs].lmx);if(tree[ls].lmx==tree[ls].len()) tree[rt].lmx+=tree[rs].lmx;if(tree[rs].rmx==tree[rs].len()) tree[rt].rmx+=tree[ls].rmx;}void build(int rt,int l,int r){tree[rt].l=l;tree[rt].r=r; if(l==r) tree[rt].init(1);else{int mid=tree[rt].mid();build(ls,l,mid);build(rs,mid+1,r);push_up(rt);}}void update(int rt,int pos,int val){//单点更新 int l=tree[rt].l,r=tree[rt].r;if(l==r) tree[rt].init(val);else{int mid=tree[rt].mid();if(pos<=mid) update(ls,pos,val);else update(rs,pos,val);push_up(rt);}}int query(int rt,int pos){int l=tree[rt].l,r=tree[rt].r;if(l==r) return tree[rt].val;int mid=tree[rt].mid();if(pos>=mid-tree[ls].rmx+1&&pos<=mid+tree[rs].lmx)return tree[ls].rmx+tree[rs].lmx;if(pos<=mid) return query(ls,pos);else return query(rs,pos);}
}seg;
int n,m;
int pre[maxn];
int main() {while(~scanf("%d%d",&n,&m)){seg.build(1,1,n);int cnt=0;for(int i=1;i<=m;i++){char op[5];int k,d;scanf("%s",op);if(op[0]=='D'){scanf("%d",&k);pre[++cnt]=k;seg.update(1,k,0);}if(op[0]=='Q'){scanf("%d",&k);printf("%d\n",seg.query(1,k));}if(op[0]=='R'){k=pre[cnt--];seg.update(1,k,1);}}}return 0;
}

HDU1540(线段树区间合并)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. HDU3308 线段树区间合并

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

  9. CF911G Mass Change Queries (线段树区间 合并)

    题意: 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 题解: 100个数,很容易想到要从这里进行突破,对于某次操作我们只需要把这个区间的数x给移动到y ...

最新文章

  1. Emoji表情图标在iOS与PHP之间通信及MySQL存储
  2. 【干货】Github标星1.2K,Visual Transformer 最全最新资源,包含期刊、顶会论文
  3. python之禅中文-python之禅-----我最喜欢的翻译版
  4. 基于IFC的大型三维城市群体——智慧城市模拟
  5. Consul和ZooKeeper的区别
  6. 成功解决keras库中出现AttributeError: ‘str‘ object has no attribute ‘decode‘
  7. 2019秋季PAT甲级考试心得
  8. html字符串转换jsx,javascript – 将React.element转换为JSX字符串
  9. 情人节,教你用Python定时给小姐姐微信发送专属问候!
  10. 【嵌入式工具】Keil下载,安装,配置教程大全
  11. 测试LOL帧数的软件,lol手游画质帧率修改器
  12. 使用Mac下的sequel Pro数据库错误MySQL said: Authentication plugin 'caching_sha2_password'
  13. C++单元测试框架Gtest的配置与使用过程
  14. GFPGAN:老旧照片的面部恢复神器
  15. 假期培训日记(数论)
  16. uboot分析之Loopback接口
  17. PS 滤镜算法原理——浮雕效果
  18. 项目国际化I18N多语言切换
  19. 【螺旋旋转爱心特效】(Html+JS+CSS+效果+全部源代码)
  20. Java 安全-JNDI注入学习

热门文章

  1. Ubuntu22.04+Nvidia RTX 3060 显卡驱动安装
  2. 再次登顶SPC-1,这家发展18年的存储厂商暗藏什么绝技?
  3. 信息学院与电气学院之间的通信
  4. 如何连接ipv6服务器_IPv6系列初学者的10个常见困扰
  5. 医疗诊断文本多分类问题(NLP)(合工大机器学习)
  6. jmeter参数化区别和使用
  7. 烟大计算机学院老师,烟台大学计算机与控制工程学院导师教师师资介绍简介-阎维青...
  8. C# 创建一个Panel并可以通过鼠标拖动并可以拉动改变大小(可生成多个Panel并保存布局到数据库中)
  9. Excel如何提取多条件不重复数据
  10. 最新浏览器排名!Chrome 逆天/ Edge 惨不忍睹