【43.49%】【hdu3308】LCIS
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6593 Accepted Submission(s): 2867
You have two operations:
U A B: replace the Ath number by B. (index counting from 0)
Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].
Each case starts with two integers n , m(0<n,m<=105).
The next line has n integers(0<=val<=105).
The next m lines each has an operation:
U A B(0<=A,n , 0<=B=105)
OR
Q A B(0<=A<=B< n).
1
10 10
7 7 3 3 5 9 9 8 1 8
Q 6 6
U 3 4
Q 0 1
Q 0 5
Q 4 7
Q 3 5
Q 0 2
Q 4 6
U 6 10
Q 0 9
1
1
4
2
3
1
2
5
【题解】
题意。给你n个整数。
会有以下两种操作:
1.把某个整数替换成另外一个数。
2.求出[l,r]这个区间内的最长上升子序列的长度。
思路是。
把一个区间[l,r]分成左右两部分。
那么这个区间内的最长上升子序列分两种情况。
第一种。整个序列都在左边。
第二种。整个序列都在右边。
第三种。一部分序列在左边,一部分序列在右边。
基于第三种。我们要在做线段树的时候记录两个值。
llong[rt],rlong[rt]。
分别表示以(rt所代表的线段的)最左边和以(rt所代表的线段的)最右边为起点和终点的最长上升子序列的长度。
如果rt<<1所在区间的最右边的元素<编号为rt<<1|1的节点所代表的区间的最左边的元素。则这两部分可以串起来。
即rlong[rt<<1]+llong[rt<<1|1];
这个可以用来更新我们记录的第3个值maxlong[rt]
即rt这个区间内不管在哪里的最长上升子序列的长度。
更具体一点,maxlong[rt] = max(maxlong[rt<<1],maxlong[rt<<1|1]);
if (左儿子最右边<右儿子最左边)
maxlong[rt] = max(maxlong[rt],rlong[rt<<1]+llong[rt<<1|1]);
记录所有节点所代表的区间的最左边和最右边的元素就可以了。
询问的时候也用类似的办法。
【代码】
#include <cstdio>
#include <algorithm>
#define lson begin,m,rt<<1
#define rson m+1,end,rt<<1|1 using namespace std; const int MAXN = 100001; int n, m,llong[MAXN*4],rlong[MAXN*4],maxlong[MAXN*4],lnum[MAXN*4],rnum[MAXN*4]; void push_up(int rt, int len)
{
bool flag = rnum[rt << 1] < lnum[rt << 1 | 1];
maxlong[rt] = max(maxlong[rt << 1], maxlong[rt << 1 | 1]);
if (flag) //左右两边接起来的情况
maxlong[rt] = max(maxlong[rt], rlong[rt << 1] + llong[rt << 1 | 1]);
llong[rt] = llong[rt << 1];
if (flag && llong[rt] == (len - (len >> 1)))//如果整个左儿子都是上升
llong[rt] += llong[rt << 1 | 1];//就尝试加上右儿子的左半部分作为rt的llong
rlong[rt] = rlong[rt << 1 | 1];
if (flag && rlong[rt] == (len >> 1))
rlong[rt] += rlong[rt << 1];
lnum[rt] = lnum[rt << 1];
rnum[rt] = rnum[rt << 1 | 1];
} void build(int begin, int end, int rt)
{
llong[rt] = rlong[rt] = maxlong[rt] = 0;
if (begin == end)
{
int x;
llong[rt] = rlong[rt] = maxlong[rt] = 1;
scanf("%d", &x);
lnum[rt] = rnum[rt] = x;
return;
}
int m = (begin + end) >> 1;
build(lson);
build(rson);
push_up(rt,end-begin+1);
} void input_data()
{
scanf("%d%d", &n, &m);
build(1, n, 1);
} void up_data(int pos, int num, int begin, int end, int rt)
{
if (begin == end)
{
lnum[rt] = rnum[rt] = num;//修改的时候只要改最左边和最右边的元素
return;
}
int m = (begin + end) >> 1;
if (pos <= m)
up_data(pos, num, lson);
else
up_data(pos, num, rson);
push_up(rt,end-begin+1);
} int query(int l, int r, int begin, int end, int rt)
{
if (l <= begin && end <= r)
return maxlong[rt];
int m = (begin + end) >> 1;
bool flag1 = false, flag2 = false; //用来判断是否能划分为两个区间。
int dd = 0;
if (l <= m)
{
dd = max(dd, query(l, r, lson));
flag1 = true;
}
if (m < r)
{
dd = max(dd, query(l, r, rson));
flag2 = true;
}
if (flag1 && flag2 && rnum[rt << 1] < lnum[rt << 1 | 1])
{
int temp = min(m - l + 1, rlong[rt << 1]);//如果这个节点不完全在所询问的区间内
int temp1 = min(r - m, llong[rt << 1 | 1]);//那么直接连起来是会越界的。
dd = max(dd, temp + temp1);
}
return dd;
} void output_ans()
{
for (int i = 1; i <= m; i++)
{
int x, y;
char op[10];
scanf("%s", op);
if (op[0] == 'U')
{
scanf("%d%d", &x, &y); //我下标习惯从1开始
x++;
up_data(x, y,1, n, 1);
}
else
{
scanf("%d%d", &x, &y);
x++; y++;
printf("%d\n",query(x, y, 1, n, 1));
}
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
int t;
scanf("%d", &t);
while (t--) //在输入的时候要递增!!!!!!!!!!!
{
input_data();
output_ans();
}
return 0;
}
【43.49%】【hdu3308】LCIS的更多相关文章
- 【UOJ#49】【UR #3】轴仓库
[UOJ#49][UR #3]轴仓库 题面 UOJ 题解 不难发现一定是每次找到离当前位置最近的一个箱子,然后把它搬过来. 那么如果我们能够确定起始位置,我们就可以二分从两侧多少距离搬箱子,判断一下时 ...
- JAVA 基础编程练习题49 【程序 49 子串出现的个数】
49 [程序 49 子串出现的个数] 题目:计算字符串中子串出现的次数 package cskaoyan; public class cskaoyan49 { public static void m ...
- 【iScroll源码学习04】分离IScroll核心
前言 最近几天我们前前后后基本将iScroll源码学的七七八八了,文章中未涉及的各位就要自己去看了 1. [iScroll源码学习03]iScroll事件机制与滚动条的实现 2. [iScroll源码 ...
- UI设计师零基础入门到精通精品视频教程【155课高清完整版】
[福吧资源网分享]课程是非常完整的,也是非常零基础的,适合任何学员,有需要的可以下载看看!课程目录:第1章 Adobe Photoshop CS6课时1 Adobe Photoshop CS6入门基础 ...
- 【Android】【录音】Android录音--AudioRecord、MediaRecorder
[Android][录音]Android录音--AudioRecord.MediaRecorder Android提供了两个API用于实现录音功能:android.media.AudioRecord. ...
- 【剑指Offer学习】【全部面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- 【iScroll源码学习01】准备阶段 - 叶小钗
[iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文 http://www.cnblogs.com/yexiaochai/p/3 ...
- A comparison of local caches (2) 【本地缓存之比较 (2)】
接上一篇: A comparison of local caches (1) [本地缓存之比较 (1)] This article will compare the asynchronous loca ...
随机推荐
- 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度
题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...
- SDUT-3373_数据结构实验之查找一:二叉排序树
数据结构实验之查找一:二叉排序树 Time Limit: 400 ms Memory Limit: 65536 KiB Problem Description 对应给定的一个序列可以唯一确定一棵二叉排 ...
- TP3.2的URL重写省略index.php问题
1. 在tp3框架的配置文件里,明确指定了路由的格式,这个配置位于thinkPHP文件夹下的conf文件夹里的convention.php中,修改以下字段 'URL_MODEL' => 2, # ...
- windows10环境运用SSH和SwitchySharp自由翱翔
以下纯干货: 安装篇: 安装git bash(自行去找下载包) 安装xshell(开始想用它,后来直接在git bash里用命令搞定了,安装它SSH Server就可用了可能) 安装Chrome的插件 ...
- Directx11学习笔记【八】 龙书D3DApp的实现
原文:Directx11学习笔记[八] 龙书D3DApp的实现 directx11龙书中的初始化程序D3DApp跟我们上次写的初始化程序大体一致,只是包含了计时器的内容,而且使用了深度模板缓冲. D3 ...
- 在laravel框架中使用ajax请求报错419
laravel框架中报419 419 unknown status 这个时候你需要将这个接口放到api路由上,这样可以跳过CSRF的检查
- Uva 10074【递推dp】
UVa 10074 题意:求01矩阵的最大子0矩阵. http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2 这里说的很清楚.先求Larg ...
- Redis 5.0新功能介绍
Redis 5.0 Redis5.0版是Redis产品的重大版本发布,我们先看一下它的最新特点: 新的流数据类型(Stream data type) https://redis.io/topics/s ...
- 上传图片如何对图片进行压缩canvas
前言:哈喽,朋友们,最近一直在马不停蹄地赶项目,很久没有写博客了.今天我们来看一下前端上传图片地时候如何对图片进行压缩 1.图片上传 我近期写项目都是使用的VUE,这里上传图片使用了Element-u ...
- WebSocket 实时更新mysql数据到页面
使用websocket的初衷是,要实时更新mysql中的报警信息到web页面显示 没怎么碰过web,代码写的是真烂,不过也算是功能实现了,放在这里也是鞭策自己,web也要多下些功夫 准备 引入依赖 & ...