[vijos]1083小白逛公园<线段树>
描述
小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。
一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择**连续**的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。
那么,就请你来帮小白选择公园吧。
格式
输入格式
第一行,两个整数N和M,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。
接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。
接下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围(1≤a,b≤N, a可以大于b!);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。
其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。
输出格式
小白每出去玩一次,都对应输出一行,只包含一个整数,表示小白可以选出的公园得分和的最大值。
样例1
样例输入1
5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
样例输出1
2
-1
限制
各个测试点2s
这是一道线段树的题,和一般不同的是这道题求一个区间内连续几个的最大值,这个就要多定义一个从左边开始和从右边开始的连续最大值lmax和rmax
在简单的提醒后,很快的把题的大部分打完了,最后卡在询问环节,还是多亏了大佬Ztraveler的帮助点醒了我
我就简单的提一下我卡住的地方
当我们要求出的L和R区间的LR在mid的同一侧就是一个简单的询问操作,但是当L和R分居mid的两侧时,就要稍作处理
我和那位大佬的方法是新开三个结构体,ly,ry,yy,分别是L到mid,mid+1到R和L到R,这样下来就可以就出L到R中的答案了
然后再提醒一点小细节,就是查询时a可能大于b也可能小于b
说的可能不是很清晰,还是看代码分析吧
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#define maxn 500005
#define lson pos<<1
#define rson pos<<1|1
using namespace std; struct node{
int sum,l,r,lmax,rmax,maxx;
}e[maxn*]; int a[maxn],n,m; void pushup(int pos)//更新操作
{
e[pos].sum=e[lson].sum+e[rson].sum;
e[pos].lmax=max(e[lson].lmax,e[lson].sum+e[rson].lmax);
e[pos].rmax=max(e[rson].rmax,e[rson].sum+e[lson].rmax);
e[pos].maxx=max(max(max(e[lson].lmax,e[rson].rmax),e[lson].rmax+e[rson].lmax),max(e[lson].maxx,e[rson].maxx));
} void build(int l,int r,int pos)
{
e[pos].l=l;e[pos].r=r;
if(l==r)
{
e[pos].lmax=a[l];
e[pos].rmax=a[l];
e[pos].maxx=a[l];
e[pos].sum =a[l];
}else{
int mid=(l+r)>>;
build(l,mid,lson);
build(mid+,r,rson);
pushup(pos);
}
} node query(int l,int r,int pos)
{
if(e[pos].l==l&&e[pos].r==r)
{
return e[pos];
}else{
int mid=(e[pos].l+e[pos].r)>>;
if(mid>=r){
return query(l,r,pos<<);
}else{
if(mid<l)return query(l,r,pos<<|);
else {//当要找的LR分居mid两侧
node ly=query(l,mid,lson);
node ry=query(mid+,r,rson);
node yy;
yy.sum=ly.sum+ry.sum;
yy.lmax=max(ly.lmax,ly.sum+ry.lmax);
yy.rmax=max(ry.rmax,ry.sum+ly.rmax);
yy.maxx=max(max(max(ly.lmax,ry.rmax),ly.rmax+ry.lmax),max(ly.maxx,ry.maxx));
return yy;
}
}
}
} void change(int l,int r,int k,int x,int pos)
{
if(l==k&&r==k)
{
e[pos].lmax=e[pos].rmax=e[pos].maxx=e[pos].sum=x;
}else{
int mid=(l+r)>>;
if(k<=mid)
{
change(l,mid,k,x,pos<<);
pushup(pos); }else{
change(mid+,r,k,x,pos<<|);
pushup(pos);
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(,n,);
for(int i=;i<=m;i++)
{
int q;
scanf("%d",&q);
if(q==)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>b)printf("%d\n",query(b,a,).maxx);
else printf("%d\n",query(a,b,).maxx);//不要被这个小细节坑了
}else{
int a,b;
scanf("%d%d",&a,&b);
change(,n,a,b,);
}
}
}
做完这题整个人都不好了,感觉这点细节都看不到,我的oi之路艰难啊!!!
ps:代码写的比较稀疏,看起来很多,其实不难的
[vijos]1083小白逛公园<线段树>的更多相关文章
- Vijos 1083 小白逛公园(线段树)
线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- [日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...
随机推荐
- vue开发路由相关基础知识和笔记
路由实现:hash模式 和 history模式 hash模式: 概述 在浏览器中符号"#",#以及#后面的字符称之为hash,用window.location.hash读取: 特点 ...
- Adobe Premiere Pro 2020破解教程
首先官网下载Adobe Creative Cloud,安装完之后使用它继续安装Pr.注意在安装之前,点击文件→首选项,先设置一下你的安装路径,没有设置则默认安装在C盘. 接着下载网上良心博主推荐的破解 ...
- JavaScript的函数(一)
,1,在javascript中,函数即对象.函数里面的参数可以是个函数,例如: data.sort(function(a,b){return a-b;}) 函数的返回值,return语句导致函数停止执 ...
- js中排序方法
有些代码一两个月都会忘了,有空多做下总结,记录下来,等需要用到的时候可以来翻翻总结的博客.写技术博客,对自己是一种总结,对别人,是一种参考. 1.sort()方法 var ar1=[2,4,6,8,1 ...
- deepin15.11安装N卡驱动,实测!!!(可解决N卡电脑关机卡屏)
前言:deepin(深度)是一款由武汉深之度公司研发的一款适合国人日常学习的linux系统,其UI精美,美过Mac.它对于中国用户的一个亮点就是QQ微信等国软件傻瓜式安装(类似安卓应用商店安装),如果 ...
- idea最下方视图中没有spring框解决方法
之前遇到过idea打开一个项目后,如图所示的spring视图框消失不见了. 并且view-Tool windows里面也找不到的问题;因为没有这个的话还挺烦的,网上搜了好久都没有资料,所以记录一下; ...
- postgreSQL外键引用查询 查询外键被那些表占用
根据一个表名,查询所有外键引用它的表,以及那些外键的列名key_column_usage(系统列信息表),pg_constraint(系统所有约束表) SELECT x.table_name, x.c ...
- 【vue】---- 图片懒加载
1.作用 在图片较多的页面中,页面加载性能较差.使用图片懒加载可以让图片出现在可视区域时再进行加载,从而提高用户体验. 2.原理 设置img标签的src属性为空或统一的图片路径(如加载中样式),监听页 ...
- scrapy 在爬取过程中抓取下载图片
先说前提,我不推荐在sarapy爬取过程中使用scrapy自带的 ImagesPipeline 进行下载,是在是太耗时间了 最好是保存,在使用其他方法下载 我这个是在 https://blog.csd ...
- MATLAB神经网络(3) 遗传算法优化BP神经网络——非线性函数拟合
3.1 案例背景 遗传算法(Genetic Algorithms)是一种模拟自然界遗传机制和生物进化论而形成的一种并行随机搜索最优化方法. 其基本要素包括:染色体编码方法.适应度函数.遗传操作和运行参 ...