题目链接

瑶瑶想要玩滑梯

Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others)

Problem Description

众所周知,瑶瑶(tsyao)是个贪玩的萌妹子,特别喜欢闹腾,恰好今天是一个风和日丽的日子,瑶瑶嚷着让姐姐带她去去公园玩滑梯,可是公园的滑梯比较独特,由单位积木搭成,积木是排成一排搭好,每列有xi个积木,共n列。小明能够对积木进行m次操作:

1.U L R yi         : 将[L,R]列的积木高度全都改为yi

2.Q L R           : 查询[L,R]列最长连续上升的列长度(LCIS)

知道[L,R]列最长连续上升的列长度过后,瑶瑶就可以开开心心地玩滑梯啦!

Ps:连续上升的列长度指对于一段合法区间,都有 

话说积木是平的,瑶瑶是怎么从高处滑到低处的呢??作为姐姐也不知道,很想知道吧?你去问她吧。。

Input

第一行 两个整数n,m;

第二行 n个整数,分别为[1,n]区间每列积木个数;

接下来m行为m个操作

Output

输出x行,每行为每次操作2的查询结果。

Sample Input

5 4
2 1 2 3 1
Q 1 4
Q 2 5
U 2 4 3
Q 1 5

Sample Output

3
3
2

Hint

对于 100%的数据,有1 ≤ n ≤ 10^5 , 1 ≤ m ≤ 10^5 , 1 ≤ xi ≤ 10^8。

单组输入,共10组数据。

第一种操作是常规的区间修改。

第二种操作求区间的LCIS, 显然有三种情况,完全来自左孩子,完全来自右孩子,或者由左孩子和右孩子共同组成。

最体的实现可以参考下面代码。 

Accepted Code:

 /*************************************************************************
> File Name: 1101.cpp
> Author: Stomach_ache
> Mail: sudaweitong@gmail.com
> Created Time: 2014年08月02日 星期六 13时32分34秒
> Propose:
************************************************************************/
//线段树
#include <cmath>
#include <string>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define lson(x) (x<<1)
#define rson(x) ((x<<1)|1)
const int maxn = ;
int a[maxn];
struct node {
int l, r; //结点区间范围
//maxo维护区间LCIS长度
//maxl维护从区间最左开始的上升子序列长度(最左必取)
//maxr维护以区间最右为止的上升子序列长度(最右必取)
int maxo, maxl, maxr;
//区间最左端和最右端的值
int numl, numr;
//区间是否完全相同, 也就是LCIS长度为1
bool s;
void set(int ll, int rr) {
l = ll; r = rr; s = false;
}
}Tr[maxn<<]; void pushup(int o) {
Tr[o].maxo = max(Tr[lson(o)].maxo, Tr[rson(o)].maxo);
Tr[o].maxl = Tr[lson(o)].maxl;
Tr[o].maxr = Tr[rson(o)].maxr;
Tr[o].numl = Tr[lson(o)].numl;
Tr[o].numr = Tr[rson(o)].numr;
//是否可合并左孩子和右孩子
if (Tr[lson(o)].numr < Tr[rson(o)].numl) {
Tr[o].maxo = max(Tr[o].maxo, Tr[lson(o)].maxr+Tr[rson(o)].maxl);
//是否可更新maxl
if (Tr[o].maxl == Tr[lson(o)].r-Tr[lson(o)].l+) {
Tr[o].maxl += Tr[rson(o)].maxl;
}
//是否可更新maxr
if (Tr[o].maxr == Tr[rson(o)].r-Tr[rson(o)].l+) {
Tr[o].maxr += Tr[lson(o)].maxr;
}
}
} void build(int o, int l, int r) {
Tr[o].set(l, r);
if (l == r) {
Tr[o].maxo = Tr[o].maxr = Tr[o].maxl = ;
Tr[o].numl = Tr[o].numr = a[l];
Tr[o].s = true;
return ;
}
int mid = (l + r) / ;
build(lson(o), l, mid);
build(rson(o), mid+, r);
pushup(o);
} void pushdown(int o) {
if (Tr[o].s) {
Tr[o].s = false;
Tr[lson(o)].maxo = Tr[lson(o)].maxl = Tr[lson(o)].maxr = ;
Tr[lson(o)].numl = Tr[lson(o)].numr = Tr[o].numl;
Tr[rson(o)].maxo = Tr[rson(o)].maxl = Tr[rson(o)].maxr = ;
Tr[rson(o)].numl = Tr[rson(o)].numr = Tr[o].numl;
Tr[lson(o)].s = Tr[rson(o)].s = true;
}
} void update(int o, int l, int r, int x) {
if (Tr[o].l >= l && Tr[o].r <= r) {
Tr[o].maxo = Tr[o].maxl = Tr[o].maxr = ;
Tr[o].numl = Tr[o].numr = x;
Tr[o].s = true;
return ;
}
pushdown(o);
int mid = Tr[lson(o)].r;
if (l <= mid) update(lson(o), l, r, x);
if (r > mid) update(rson(o), l, r, x);
pushup(o);
} int query(int o, int l, int r) {
if (Tr[o].l >= l && Tr[o].r <= r) {
return Tr[o].maxo;
}
pushdown(o);
int mid = Tr[lson(o)].r;
//三种可能构成最优解的情况
int ansl(), ansr(), anso();
if (l <= mid) ansl = query(lson(o), l, r);
if (r > mid) ansr = query(rson(o), l, r);
if (l <= mid && r > mid) {
if (Tr[lson(o)].numr < Tr[rson(o)].numl) {
anso = Tr[lson(o)].maxr + Tr[rson(o)].maxl;
}
}
return max(anso, max(ansl, ansr));
} int main(void) {
int n, m;
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++) scanf("%d", a + i);
build(, , n); while (m--) {
char t[];
//注意输入
scanf("%s", t);
if (t[] == 'U') {
int l, r, x;
scanf("%d %d %d", &l, &r, &x);
update(, l, r, x);
} else {
int l, r;
scanf("%d %d", &l, &r);
printf("%d\n", query(, l, r));
}
} return ;
}

ACdream 1101 线段树的更多相关文章

  1. ACdream 1427—— Nice Sequence——————【线段树单点更新,区间查询】

    Nice Sequence Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Su ...

  2. POJ 3468 A Simple Problem with Integers (线段树)

    题意:给定两种操作,一种是区间都加上一个数,另一个查询区间和. 析:水题,线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024 ...

  3. HDU 1754 I Hate It (线段树)

    题意:略. 析:裸的线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include < ...

  4. HDU 1166 敌兵布阵 (数状数组,或线段树)

    题意:... 析:可以直接用数状数组进行模拟,也可以用线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...

  5. HDU 5023 A Corrupt Mayor's Performance Art (据说是线段树)

    题意:给定一个1-n的墙,然后有两种操作,一种是P l ,r, a 把l-r的墙都染成a这种颜色,另一种是 Q l, r 表示,输出 l-r 区间内的颜色. 析:应该是一个线段树+状态压缩,但是我用s ...

  6. UVa 11297 Census (二维线段树)

    题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...

  7. Gym 101201J Shopping (线段树+取模)

    题意:给定 n 个物品,然后有 m 个人买东西,他们有 x 元钱,然后从 l - r 这个区间内买东西,对于每个物品都尽可能多的买,问你最少剩下多少钱. 析:对于物品,尽可能多的买的意思就是对这个物品 ...

  8. 14-敌兵布阵(HDU1166线段树 & 树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. BZOJ 2243 染色 (线段树+树链剖分)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9895  Solved: 3735[Submit][Status ...

随机推荐

  1. {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)

    {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)   Django基础七之 ...

  2. java线程池的使用学习

    目录 1. 线程池的创建 2. 线程池的运行规则 3. 线程池的关闭 4. 线程池的使用场合 5. 线程池大小的设置 6 实现举例 1. 线程池的创建 线程池的创建使用ThreadPoolExecut ...

  3. Numpy数据的操作 * dot() multiply() 的区别

    使用numpy时,跟matlab不同: 1.* dot() multiply() 对于array来说,* 和 dot()运算不同 *是每个元素对应相乘 dot()是矩阵乘法 对于matrix来说,*  ...

  4. Windows API 23 篇 WTSQuerySessionInformation

    函数原型:BOOLWINAPIWTSQuerySessionInformationW(                                                      IN ...

  5. [转]WPF--模板选择

    典型的,把模板关联到一块特定的数据上,不过通常希望动态的确定使用哪个模板---既可以基于一个属性值,也可以是一个全局状态.当真正需要大规模替换模板时,也可以使用DataTemplateSelector ...

  6. 分布式事务中间件 Fescar—RM 模块源码解读

    前言 在SOA.微服务架构流行的年代,许多复杂业务上需要支持多资源占用场景,而在分布式系统中因为某个资源不足而导致其它资源占用回滚的系统设计一直是个难点.我所在的团队也遇到了这个问题,为解决这个问题上 ...

  7. Java虚拟机原理图解-- 1.2.2、Class文件中的常量池详解(上)[转]

    NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数.副版本号.主 ...

  8. Cesium官方教程4--影像图层

    原文地址:https://cesiumjs.org/tutorials/Imagery-Layers-Tutorial/ 影像图层 Cesium支持多种服务来源的高精度影像(地图)数据的加载和渲染.图 ...

  9. sql删除重复的记录保留一条

    delete from A_TO_NOW where yuan_name in (select   yuan_name from A_TO_NOW group by   yuan_name   hav ...

  10. 谈谈数据库sql编写

    本文主要给初学者关于关系数库的一个浮光掠影式的介绍,如果想深入理解,必须对于下文提到的每个内容单独深入学习! it-information technology的简称,中文是信息机技术,信息其实就是数 ...