ACdream 1101 线段树
瑶瑶想要玩滑梯
Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others)SubmitStatisticNext ProblemProblem 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 5Sample Output
3
3
2Hint
对于 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 线段树的更多相关文章
- ACdream 1427—— Nice Sequence——————【线段树单点更新,区间查询】
Nice Sequence Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Su ...
- POJ 3468 A Simple Problem with Integers (线段树)
题意:给定两种操作,一种是区间都加上一个数,另一个查询区间和. 析:水题,线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024 ...
- HDU 1754 I Hate It (线段树)
题意:略. 析:裸的线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include < ...
- HDU 1166 敌兵布阵 (数状数组,或线段树)
题意:... 析:可以直接用数状数组进行模拟,也可以用线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...
- HDU 5023 A Corrupt Mayor's Performance Art (据说是线段树)
题意:给定一个1-n的墙,然后有两种操作,一种是P l ,r, a 把l-r的墙都染成a这种颜色,另一种是 Q l, r 表示,输出 l-r 区间内的颜色. 析:应该是一个线段树+状态压缩,但是我用s ...
- UVa 11297 Census (二维线段树)
题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...
- Gym 101201J Shopping (线段树+取模)
题意:给定 n 个物品,然后有 m 个人买东西,他们有 x 元钱,然后从 l - r 这个区间内买东西,对于每个物品都尽可能多的买,问你最少剩下多少钱. 析:对于物品,尽可能多的买的意思就是对这个物品 ...
- 14-敌兵布阵(HDU1166线段树 & 树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- BZOJ 2243 染色 (线段树+树链剖分)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9895 Solved: 3735[Submit][Status ...
随机推荐
- java代码优化写法1(转摘)
源文地址:https://blog.csdn.net/qq_15766297/article/details/70503222 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修 ...
- SW数据库结构列表
数据表列表 PE_Admin:管理员信息表 PE_Advertisement:广告信息表 PE_AdZone:版位信息表 PE_Announce:公告信息表 PE_AreaCollection:采集信 ...
- tensorflow的object detection的data augmention的使用
在protoc的目录下有data augmention的提示,而且注意是repeated,也就是你要这样写: 不能写在一个data_aumentation_options下面,至于有哪些选项可以用,可 ...
- Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
您需要在二叉树的每一行中找到最大的值. 示例: 输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9] class Solution { public: vector<i ...
- SpringBoot Controller接收参数的几种方式盘点
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:SpringBoot Controller接收参数的几种方式盘点: SpringBoot Controller接收参数的几种常用方式盘点 ...
- C++项目使用的开源库记录
日志库:log4cplus 网络库:libcurl xml库:tinyxml 多媒体库:lib555 视频解码库:ffmpeg 用opencv的VideoCapture类可以直接打开rtsp视频,所以 ...
- Error-SQLServer:【失败】win7装SQL server2017
ylbtech-Error-SQLServer:[失败]win7装SQL server2017 1.返回顶部 1. 2018年08月15日 22:06:38 USCWIFI 阅读数:5433 版 ...
- Jeecms6中后台控制层Action如何将值传入前台视图层模板中的?
转载:https://blog.csdn.net/wsm201005030226/article/details/44343069 Jeecms后台控制层如何传值到前台freemarker的? ...
- Jmeter分布式测试笔记
在性能测试过程中,如果要求并发数较大时(例如1000+),单机配置cpu与内存等无法支持,则需要使用Jmeter的分布式测试方法. 一.一般什么情况下需要分布式 1.前辈经验:比如机器i5双核的cpu ...
- Python实例3-字符图网格
假定有一个列表的列表, 内层列表的每个值都是包含一个字符的字符串, 像这样: grid = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', ...