这个是一个很简单很明显的线段树的区间合并,不过区间合并的题目都还是有点难写,建议存个板子。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
struct node
{
int l, r, rp, lp, len;
int max_pre, max_sub, max_last;
}tree[maxn*];
int a[maxn]; void push_up(int id)
{
tree[id].rp = tree[id<<|].rp;
tree[id].lp = tree[id << ].lp;
tree[id].max_pre = tree[id << ].max_pre;
tree[id].max_last = tree[id << | ].max_last;
tree[id].max_sub = max(tree[id << ].max_sub, tree[id << | ].max_sub);
if(tree[id<<].rp<tree[id<<|].lp)
{
if (tree[id << ].max_pre == tree[id << ].len) tree[id].max_pre += tree[id << | ].max_pre;
if (tree[id << | ].max_last == tree[id << | ].len) tree[id].max_last += tree[id << ].max_last;
tree[id].max_sub = max(tree[id].max_sub, tree[id << ].max_last + tree[id<<|].max_pre);
}
} void build(int id,int l,int r)
{
tree[id].l = l;
tree[id].r = r;
tree[id].len = r - l + ;
if(l==r)
{
tree[id].rp = tree[id].lp = a[l];
tree[id].max_pre = tree[id].max_last = tree[id].max_sub = ;
return;
}
int mid = (l+r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
push_up(id);
} int query(int id,int x,int y)
{
int ans = ;
if(x<=tree[id].l&&tree[id].r<=y)
{
return tree[id].max_sub;
}
int mid = (tree[id].l + tree[id].r) >> ;
if (x <= mid) ans = max(ans, query(id << , x, y));
if (y > mid) ans = max(ans, query(id << | , x, y));
if(tree[id<<].rp<tree[id<<|].lp)
{
ans = max(ans, min(mid - x + , tree[id << ].max_last) + min(y - mid, tree[id << | ].max_pre));
}
return ans;
} void update(int id,int x,int z)
{
if(tree[id].l==tree[id].r&&tree[id].l==x)
{
tree[id].rp = z;
tree[id].lp = z;
return;
}
int mid = (tree[id].l + tree[id].r) >> ;
if (x <= mid) update(id << , x, z);
if (x > mid) update(id << | , x, z);
push_up(id);
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=;i<=n;i++)
{
scanf("%d", &a[i]);
}
build(, , n);
while(m--)
{
char s[];
int x, y;
scanf("%s %d %d", s, &x, &y);
if(s[]=='Q')
{
int ans = query(, x+, y+);
printf("%d\n", ans);
}
else update(, x+, y);
}
}
}

线段树的区间合并 B - LCIS的更多相关文章

  1. 线段树:CDOJ1592-An easy problem B (线段树的区间合并)

    An easy problem B Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  2. CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)

    题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...

  3. Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并

    D. Developing Game   Pavel is going to make a game of his dream. However, he knows that he can't mak ...

  4. [HDOJ3308]LCIS(线段树,区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意:给定n个数,两个操作: U A B:将位置A的数值改成B Q A B:查询[A,B]内最长 ...

  5. POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并

    看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...

  6. HDU_3308_线段树_区间合并

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. POJ 2750 Potted Flower(线段树的区间合并)

    点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...

  8. HDU3308 线段树(区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. 线段树(区间合并)HDU - 1540

    题意:输入n,m,给定n个相互连通的村庄,有m个操作,D x,表示破坏x村庄使其与相邻的两个村庄不相通,R 表示修复上一个被破坏的村庄,与相邻的两个村庄联通.Q x表示与x相连的村庄有多少个. 思路: ...

随机推荐

  1. 【FreeMarker】【程序开发】数据模型,对象包装

    [FreeMarker][程序开发]数据模型,对象包装 分类: Java.FreeMarker2014-10-25 18:49 413人阅读 评论(0) 收藏 举报 FreeMarker   目录(? ...

  2. 1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、212345等. 要求:”4”不能在第三位,”3”与”5”不能相连。

    private static String[] mustExistNumber = new String[] { "1", "2", "2" ...

  3. Linux下配置mail使用外部SMTP发送邮件

    修改/etc/mail.rc,增加两行:指定外部的smtp服务器地址.帐号密码等. # vi /etc/mail.rc set from=demo@qq.com smtp=smtp.qq.com se ...

  4. three.js obj转js的详细步骤 convert_obj_three.py的用法

    three.js是最近非常流行的一个前端webgl库. js格式的模型文件是three.js中可以直接加载的文件.使用THREE.JSONLoader()直接加载,而不需要引用其它的loader插件. ...

  5. NIO教程 ——检视阅读

    NIO教程 --检视阅读 参考 BIO,NIO,AIO 总结 Java NIO浅析 Java NIO 教程--极客,蓝本 Java NIO 系列教程 --并发编程网 BIO,NIO--知乎 NIO 入 ...

  6. react-i8n

    1. 在项目中安装 npm install react-intl --save 2.兼容Safari各个版本需要安装intl npm install intl --save 3.编写语言包 1.)新建 ...

  7. SQLyog-证书密钥

    * 用户名: + 随意填写 * 秘钥: + b70d7f66-dac2-4462-bf51-c4e9347da763 + ccbfc13e-c31d-42ce-8939-3c7e63ed5417 + ...

  8. C++养成好的代码习惯

    [C++小技巧] -------------------------------------------------------------#ifdef _DEBUG    imwrite(" ...

  9. HTML+CSS教程(四)选择器(id选择器,类选择器,标签选择器,子代选择器,后代选择器,组选择器,伪类选择器)/css引入页面的形式(行内样式、内嵌样式、外联样式)

    一.回顾内容 前端的三大组成(三大模块)    HTMl(超文本标记语言) 结构层    css(层叠样式表) 表现层:用来美化HTML结构    JS(Java script)(脚本语言) 行为层: ...

  10. centos7与8的区别

    1.关于内核版本:RHEL8采用4.18.0-xRHEL7采用3.10-0-x 2 网络时间同步 RHEL8 只使用Chronyd,不支持NTP部署. RHEL7Chronyd与NTP两者都支持 3. ...