题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367

官方题解:

对于求“高山脉”长度,可以利用线段树。树节点中保存左高度连续长度,左高度连续区间的高度,左高度连续区间的状态(即是否高于第一个高度不同的山),右高度连续长度,右高度连续区间的高度,右高度连续区间的状态,每段区间内的“高山脉”数量。每次更新时更新高度即可,在pushup过程中去计算新产生的“高山脉”。写起来难度不是很大,然后对于n很大且必须在线做这个条件只需对于线段树动态建立节点去维护即可

#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;
typedef long long LL;
const int maxn=50010;
const int maxm=1010;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
int N,Q;
int root,cur;
struct Node
{int sum;  //共有多少高山脉int ch[2];//左右孩子编号int rsum,lsum;//从左边起、从右边起高度相同的连续的有多少个int lh,rh;//左边连续、右边连续的高度int ll,rr;//左边第一个不连续的,右边第一个不连续的高度int add;  void init(int l,int r){add=sum=lh=rh=ll=rr=ch[0]=ch[1]=0;lsum=rsum=r-l+1;}
};
struct IntervalTree
{Node node[maxn*60];void check(int & o,int l,int r){if(o)return;o=++cur;node[o].init(l,r);if(l==1)node[o].ll=INF;if(r==N)node[o].rr=INF;}void maintain(int o,int val){node[o].add+=val;node[o].rr+=val;node[o].ll+=val;node[o].lh+=val;node[o].rh+=val;}void pushdown(int o,int l,int r){if(node[o].add){int mid=(l+r)>>1;check(node[o].ch[0],l,mid);check(node[o].ch[1],mid+1,r);maintain(node[o].ch[0],node[o].add);maintain(node[o].ch[1],node[o].add);node[o].add=0;}}void pushup(int o,int l,int r){int mid=(l+r)>>1;check(node[o].ch[0],l,mid);check(node[o].ch[1],mid+1,r);int lson=node[o].ch[0],rson=node[o].ch[1];node[o].sum=node[lson].sum+node[rson].sum;node[o].lsum=node[lson].lsum;node[o].rsum=node[rson].rsum;node[o].lh=node[lson].lh;node[o].rh=node[rson].rh;node[o].ll=node[lson].ll;node[o].rr=node[rson].rr;if(node[lson].rh==node[rson].lh){if(node[lson].rh>node[lson].rr&&node[rson].lh>node[rson].ll)node[o].sum+=node[lson].rsum+node[rson].lsum;if(node[lson].rsum==mid-l+1){node[o].lsum+=node[rson].lsum;node[o].ll=node[rson].ll;}if(node[rson].lsum==r-mid){node[o].rsum+=node[lson].rsum;node[o].rr=node[lson].rr;}}else{if(node[lson].lsum==mid-l+1)node[o].ll=node[rson].lh;if(node[lson].rh>node[rson].lh&&node[lson].rh>node[lson].rr)node[o].sum+=node[lson].rsum;if(node[rson].rsum==r-mid)node[o].rr=node[lson].rh;if(node[rson].lh>node[lson].rh&&node[rson].lh>node[rson].ll)node[o].sum+=node[rson].lsum;}}void update(int &o,int l,int r,int q1,int q2,int x){check(o,l,r);if(q1<=l&&r<=q2){maintain(o,x);return ;}pushdown(o,l,r);int mid=(l+r)>>1;if(q1<=mid)update(node[o].ch[0],l,mid,q1,q2,x);if(q2>mid)update(node[o].ch[1],mid+1,r,q1,q2,x);pushup(o,l,r);}
}tree;
void solve()
{root=cur=0;int ans=0;int l,r,val;for(int i=0;i<Q;i++){scanf("%d%d%d",&l,&r,&val);l^=ans,r^=ans,val^=ans;if(l>r)swap(l,r);tree.update(root,1,N,l,r,val);ans=tree.node[1].sum;printf("%d\n",ans);}
}
int main()
{while(scanf("%d%d%*d",&N,&Q)!=EOF)solve();return 0;
}

hdu 5367(线段树+区间合并)相关推荐

  1. hdu 1806线段树 区间合并

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

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

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

  3. HDU3308 线段树区间合并

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享
  2. python使用argparse解析命令行参数
  3. 基于投影仪的定位技术
  4. shell 脚本 变量 获取程序输出结果异常分析
  5. MSMQ: C# MSMQ编程问题
  6. 轻松搞定RocketMQ入门
  7. Visual C++中的异常处理浅析(上)
  8. [cf797c]Minimal string(贪心+模拟)
  9. centos通过添加chrome源来安装chrome
  10. HTML出现jQuery.Deferred exception: undefined is not a function,已解决
  11. c++注释快捷键_是不是晚了点:Visual Studio可以自动生成注释啦!
  12. SQL Server学习之路(六):“增删改查”之“查”
  13. java pcm to wav_Java音频转换:PCM格式转WAV格式
  14. 中国特有的狸花猫有多强大?
  15. C语言修改终端文字颜色
  16. C语言:srand函数与rand函数的使用(纯干货)【易懂】
  17. 关于程序员网站,这七家超级实用!(来自36氪推荐)
  18. springboot-鑫源停车场管理系统毕业设计源码290915
  19. c语言和mysql实现超市的管理_C语言编写的超市管理系统
  20. 数据流代替工作流解决方案

热门文章

  1. 华南理工计算机网络随随堂,计算机组成原理-2019春华工网络教育随堂练习
  2. 神策数据受邀参加全国 APP 个人信息保护监管会
  3. 神策数据 × 水滴汽车:着眼车主忠诚度,实现转型期逆势增长!
  4. PPT 下载 | 神策数据算法专家:推荐系统的实践与思考(下)
  5. Ajax(form表单文件上传、请求头之contentType、Ajax传递json数据、Ajax文件上传)
  6. BootStrap Table使用
  7. MYSQL创建一个function用来计算经纬度距离
  8. 企业信息门户与办公自动化的集成应用
  9. 使用Javascript来实现的超炫组织结构图(Organization Chart)
  10. 【转】5亿个数找中位数