ACdream P1101 瑶瑶想要玩滑梯

2023-10-17 18:32

本文主要是介绍ACdream P1101 瑶瑶想要玩滑梯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

瑶瑶想要玩滑梯

Time Limit: 10000/5000MS (Java/Others) Memory Limit: 512000/256000KB (Java/Others)
Submit Statistic Next Problem
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组数据。

Source
tsyao
Manager
tsyao


不知你是否相信 这是我两年来做线段树第一次使用LAZY标记,以前虽然早就听说过LAZY标记对线段树修改时的优化,但一直以为太简单而没有去重视- -||| 这一次果断自己写了一个果然各种WA,不过最终结局是好的。

此题是一道经典维护线段树+LAZY标记的使用,说真的这题线段树题做的跟DP一样,各种蛋疼。线段树维护五个值,左右端点上的数值,左边这个数取了之后的LIS(最长连续上升子序列)(记为lv),右边这个数取了之后的LIS(rv),以及整条线段的LIS(v),更新区间时的过程相当麻烦,我怕越讲越烦就不赘述了,最好自己想通为什么要维护这五个值以及更新过程,或者看下面的代码~~~。

稍微讲一下LAZY标记的使用,当我们更新某段区间时,不可能把这段区间之下的所有子区间都更新,因为那样是n*n的复杂度,会超时,所以LAZY标记可以解决这一问题,更新大段时,大段先更新,并把lazy标记传递到它的两个子段中,等用到那两个子段时再更新,要用好LAZY标记尚需大量的实践,因为题目不是死的。


代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<queue>
#include<stack> 
#include<vector>
#include<cmath>
#include<iomanip>
#define rep(i,n) for(i=1;i<=n;i++)
#define MM(a,t) memset(a,t,sizeof(a))
#define INF 1e9
typedef long long ll;
#define mod 1000000007
using namespace std;
int n,m;
int a[100020];
struct aaa{int l,r,v,lv,rv;int lazy;
}xds[400020];
void update(int l,int r,int node,int num){xds[node].lazy=-1;if(l<r){xds[node*2].lazy=num; xds[node*2+1].lazy=num;}xds[node].l=xds[node].r=num;xds[node].v=xds[node].lv=xds[node].rv=1;
}
void pushup(int l,int r,int mid,int node){int v=1;if(l<r){if(xds[node*2].lazy!=-1) 	update(l,mid,node*2,xds[node*2].lazy);if(xds[node*2+1].lazy!=-1)update(mid+1,r,node*2+1,xds[node*2+1].lazy);} xds[node].l=xds[node*2].l; xds[node].r=xds[node*2+1].r;xds[node].rv=xds[node*2+1].rv; xds[node].lv=xds[node*2].lv;if(xds[node*2+1].l>xds[node*2].r){v=max(v,xds[node*2].rv+xds[node*2+1].lv);if(xds[node*2+1].v==r-mid) xds[node].rv=r-mid+xds[node*2].rv;if(xds[node*2].v==mid-l+1) xds[node].lv=mid-l+1+xds[node*2+1].lv;}v=max(v,max(xds[node*2].v,xds[node*2+1].v));xds[node].v=v;if(v==(r-l+1)){xds[node].lv=r-l+1;xds[node].rv=r-l+1; 	}	
}
void build(int l,int r,int node){xds[node].lazy=-1;if(l==r){xds[node].v=1;xds[node].lv=1;xds[node].rv=1;xds[node].l=a[l];xds[node].r=a[l];}else{int mid=(l+r)/2;build(l,mid,node*2); build(mid+1,r,node*2+1);pushup(l,r,mid,node);}	
}
void change(int l,int r,int node,int x,int y,int num){if(xds[node].lazy!=-1) update(l,r,node,xds[node].lazy);if(l==x && r==y){xds[node].lazy=num;update(l,r,node,num);}	else{int mid=(l+r)/2;if(x>=mid+1)      change(mid+1,r,node*2+1,x,y,num);else if(y<=mid)   change(l,mid,node*2,x,y,num);else{change(l,mid,node*2,x,mid,num);change(mid+1,r,node*2+1,mid+1,y,num);	}	pushup(l,r,mid,node);}
}
aaa query(int l,int r,int node,int x,int y){aaa res;if(xds[node].lazy!=-1) update(l,r,node,xds[node].lazy);if(x==l && y==r){return xds[node];}	else{int mid=(l+r)/2;if(x>=mid+1) return query(mid+1,r,node*2+1,x,y);if(y<=mid)   return query(l,mid,node*2,x,y);aaa t1=query(l,mid,node*2,x,mid),t2=query(mid+1,r,node*2+1,mid+1,y);int v=1;res.l=t1.l; res.r=t2.r;res.rv=t2.rv; res.lv=t1.lv;if(t2.l>t1.r){v=max(v,t1.rv+t2.lv);if(t2.v==y-mid) res.rv=y-mid+t1.rv;if(t1.v==mid-x+1) res.lv=mid-x+1+t2.lv;}v=max(v,max(t1.v,t2.v));res.v=v;if(v==(y-x+1)){res.lv=y-x+1;res.rv=y-x+1; 	}		return res;}
}
int main()
{int i,j;scanf("%d%d",&n,&m);rep(i,n) scanf("%d",&a[i]);build(1,n,1);getchar();rep(i,m){int l,r,num;char op[100];scanf("%s",op);if(op[0]=='Q'){scanf("%d%d",&l,&r);	printf("%d\n",query(1,n,1,l,r).v);}else{scanf("%d%d%d",&l,&r,&num);change(1,n,1,l,r,num);}}return 0;
}



这篇关于ACdream P1101 瑶瑶想要玩滑梯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227193

相关文章

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户: 在OPPO手机中格式化存储卡后可以恢复图片吗?我删除了 OPPO上的视频和图片,我感觉很糟糕,因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的照片吗?我不小心格式化了OPPO SD 卡,有希望恢复已删除的照片吗? 救命!我在清理时删除了我的照片,我的问题是是否有任何免费软件可以从OPPO中恢复已

ACdream区域赛指导赛之手速赛系列(4)

点击打开题目链接 #include <iostream>#include <map>#include <cstdio>#include <string>using namespace std;int a[501];//题意是能不能把一组两个人分到两个不同的正营里面,关键利用map映射void init(){for(int i = 0; i <= 200; i++){a[i]

找第K大数(ACdream 1099)

瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others)  Memory Limit: 256000/128000KB (Java/Others) Submit  Statistic  Next Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。

【ACDream】1074 风之国 线段树+DP

风之国 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 KB (Java/Others) Problem Description 在X轴上有这样一个国家——风之国。风之国虽然是一个国家,但是却有N个首领,每个首领管辖着各自的一个城市。曾几何时,风之国是非常和

【ACDream】 1093 女神的正多面体 矩阵快速幂

题目大意:给你三种正多边形,给你起点s,终点e以及最多行走的步数k,问有多少种路径方案(路径中只要有一个顶点不同即视为不同)。 题目分析: 可以通过矩阵快速幂求解。 为每个正多边形(最多三个)构建一个邻接矩阵A,然后第K步的方案数即为A^k。 结果即为A^1 + A^2 + A^3 + ...... + A^k. 对于这种形式的矩阵运算,我们可以把它拆分成: k为奇:ans = (

【ACdream】1157 Segments cdq分治

传送门:【ACdream】1157 Segments 题目分析:第一题cdq(陈丹琦)分治!cdq_____Orz! 听说cdq分治可以写,就去学了cdq分治了。。 在我们平常使用的分治中,每一个子问题只解决它本身(可以说是封闭的)。 而在cdq分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身。 具体算法流程如下: 1.将整个操作序列分为两个长

【ACdream】ACdream原创群赛(18)のAK's dream

这次的群赛AK的不少,7题的也很多啊。。Orrrrrrrz。。。。 暂时只写出7题。。。 A:1196 模拟。。 /** this code is made by poursoul* Problem: 1196* Verdict: Accepted* Submission Date: 2014-09-06 19:12:44* Time: 0MS* Memo

不管夫妻还是情人,想要长相厮守、生活幸福美满,就这两个字!

你好,我是腾阳。 近年来,娱乐圈频传“闪婚闪离”的消息,每一次都牵动着公众敏感的神经。 从光鲜亮丽的荧幕情侣到分道扬镳的路人,他们的故事如同一面镜子,映照出现代人情感关系的脆弱与浮躁。 相比之下,那些能够在公众视野中长久保持恩爱如初的夫妻,如邓超与孙俪。 相互扶持,共同成长,在繁忙的工作之余,也不忘经营彼此的小确幸。 他们的婚姻,成为了无数人心中的榜样。 我们观察身边那些美满幸

新电脑Win11系统想要降级为Win10怎么操作?

前言 现在的电脑大部分都是Windows 11系统,组装机还好一些,如果想要使用Windows 10,只需要在安装系统的时候选择Windows 10镜像即可。 但是对于新笔记本、厂商的成品机、一体机来说,只要是全新的电脑,基本上都是Windows 11了。 有部分小伙伴就觉得,Windows 11也挺好,为啥非得要Windows10呢? 那是因为Windows10经过了多年的沉淀更

Mudo03 vscode配置相应的文件的搜索路径,库文件的搜索路径以及想要的链接库

使用muduo库,需要链接libmuduo_base.so、libmuduo_net.so 、libpthread.so VScode上如何配置相应的头文件的搜索路径?库文件的搜索路径? 文件的搜索路径:         -I:头文件搜索路径         -L:库文件搜索路径         -Imuduo_net :库名称 头文件和库文件搜索路径主要在.json文件中设置: