题目链接

瑶瑶想要玩滑梯

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. elasticsearch java 索引操作

    1.添加maven依赖 <dependency> <groupId>org.elasticsearch</groupId> <artifactId>el ...

  2. 2019-8-31-C#-性能分析-反射-VS-配置文件-VS-预编译

    title author date CreateTime categories C# 性能分析 反射 VS 配置文件 VS 预编译 lindexi 2019-08-31 16:55:58 +0800 ...

  3. 嘴巴题6 BZOJ3450JoyOI1952 Easy

    Time Limit: 10 Sec Memory Limit: 128 MB Submit: 936 Solved: 698 [Submit][Status][Discuss] Descriptio ...

  4. Leetcode950. Reveal Cards In Increasing Order按递增顺序显示卡牌

    牌组中的每张卡牌都对应有一个唯一的整数.你可以按你想要的顺序对这套卡片进行排序. 最初,这些卡牌在牌组里是正面朝下的(即,未显示状态). 现在,重复执行以下步骤,直到显示所有卡牌为止: 从牌组顶部抽一 ...

  5. jQuery3动画+创建元素

    一.jQuery的动画 1.jQuery自带的动画 1>变化的是width height opacity display <!DOCTYPE html> <html lang= ...

  6. 关于JEECMS套站工具的使用要点

      第一步:在[界面—资源]下面引入资源文件(js,css,img…) 第二步:在[界面—模板]下面将网站的入口页面写在[index]文件下 此时修改index页面中的 js,css,图片 的路径,路 ...

  7. 加载框(loading)

    一般在用户提交数据或者新加载页面时,请求服务器的过程,页面没有响应,但是用户并不知道,此时在发生什么.这时,就需要loading框给用户提示,增加用户体验. 1.引入loading.css. html ...

  8. 简单的选项卡制作(原生JS)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Python3实用编程技巧进阶

    Python3实用编程技巧进阶  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...

  10. Django项目: 项目环境搭建 ---- 一、创建django项目

    项目环境搭建 一.创建django项目 1.创建python虚拟环境 在虚拟机上创建python虚拟环境,因为实际项目部署,实在linux mkvirtualenv -p /usr/bin/pytho ...