首页 > 其他分享 >做题记录整理线段树2 P4513. 小白逛公园(2022/9/20)

做题记录整理线段树2 P4513. 小白逛公园(2022/9/20)

时间:2022-09-20 15:23:18浏览次数:109  
标签:20 前缀 max ll mid 2022 ans P4513 lld

P4513. 小白逛公园

我们思考一个如何使用线段树维护这个答案,会发现

l.r的答案=max(l,mid的答案,mid+1,r的答案,横跨两个区间的答案)

那么我们现在再引入一个区间的最大前缀和最大后缀,这题就变成了

l.r的答案=max(l,mid的答案,mid+1,r的答案,l,mid的最大后缀+mid+1,r的最大前缀)

此时我们就变成了思考如何维护最大前缀,和最大后缀,显而易见

l.r的最大前缀=max(l,mid的最大前缀,l,mid的和+mid+1,r的最大前缀)

最大后缀同理,所以我们有引入了了一个区间求和,一起处理就得了

#include<bits/stdc++.h>
using namespace std;
#define for1(i,a,b) for(ll i = a;i <=b;i++)
#define ll long long
ll n,a[600000],m,x,y,k,ji;
struct node {
	ll l;
	ll r;
	ll zhi;
	ll mxl;
	ll mxr;
	ll ans;
} s[600000*4];

void pushup(ll q) {
	s[q].zhi=s[q*2].zhi+s[q*2+1].zhi;
	
	s[q].mxl=max(s[q*2].mxl,s[q*2].zhi+s[q*2+1].mxl);
	
	s[q].mxr=max(s[q*2+1].mxr,s[q*2+1].zhi+s[q*2].mxr);
	
	s[q].ans=max(max(s[q*2].ans,s[q*2+1].ans),s[q*2].mxr+s[q*2+1].mxl);
	
	return ;
}

void build(ll q,ll l,ll r) {
	s[q].l=l;
	s[q].r=r;
	if(l==r) {
		s[q].zhi=a[l];
		s[q].mxl=a[l];
		s[q].mxr=a[l];
		s[q].ans=a[l];
		return ;
	}
	ll mid = (l+r)/2;
	build(q*2,l,mid);
	build(q*2+1,mid+1,r);
	pushup(q);
}

void xg(ll q,ll l,ll k) 
{
	ll mid = (s[q].l+s[q].r)/2;
	if(s[q].l==l&&s[q].r==l) {
		s[q].zhi=k;
		s[q].mxr=k;
		s[q].mxl=k;
		s[q].ans=k;
		return ;
	}
	
	if(l<=mid) xg(q*2,l,k);
	if(l>mid) xg(q*2+1,l,k);
	pushup(q);
}

ll qhz(ll q,ll l,ll r)//zhi

{
	ll mid = (s[q].l+s[q].r)/2;
	if(s[q].l>=l&&s[q].r<=r) {
		return s[q].zhi;
	}
	ll ans=0;
	if(l<=mid) ans+=qhz(q*2,l,r);
	if(r>mid) ans+=qhz(q*2+1,l,r);
	return ans;
}

ll qh2(ll q,ll l,ll r)//mxl

{
	ll mid = (s[q].l+s[q].r)/2;
	if(s[q].l>=l&&s[q].r<=r) {
		return s[q].mxl;
	}
	ll ans=-1e8;
	ll zmxl=-1e8;;
	ll ymxl=-1e8;
	ll zzhi=-1e8;
	if(l<=mid) zmxl=qh2(q*2,l,r),zzhi=qhz(q*2,l,r);
	if(r>mid) ymxl=qh2(q*2+1,l,r);
	ans=max(zmxl,zzhi+ymxl);
	return ans;
}
ll qh3(ll q,ll l,ll r)//mxr

{
	ll mid = (s[q].l+s[q].r)/2;
	if(s[q].l>=l&&s[q].r<=r) {
		return s[q].mxr;
	}
	ll ans=-1e8;
	ll zmxr=-1e8;;
	ll ymxr=-1e8;
	ll yzhi=-1e8;
	if(l<=mid) zmxr=qh3(q*2,l,r);
	if(r>mid) ymxr=qh3(q*2+1,l,r),yzhi=qhz(q*2+1,l,r);
	ans=max(ymxr,yzhi+zmxr);
	return ans;
}

ll qh(ll q,ll l,ll r)//ans
{
	ll mid = (s[q].l+s[q].r)/2;
	if(s[q].l>=l&&s[q].r<=r) {
		return s[q].ans;
	}
	ll ans=0;
	ll zans=-1e8;
	ll yans=-1e8;
	ll zmxr=-1e8;
	ll ymxl=-1e8;
	if(l<=mid) yans=qh(q*2,l,r),zmxr=qh3(q*2,l,r);
	if(r>mid) zans=qh(q*2+1,l,r),ymxl=qh2(q*2+1,l,r);
	ans=max(zans,max(yans,zmxr+ymxl));
	return ans;
}


int main() {
	scanf("%lld%lld",&n,&m);
	for1(i,1,n)scanf("%lld",&a[i]);
	build(1,1,n);
	for1(i,1,m) {
		scanf("%lld",&ji);
		if(ji==2) {
			scanf("%lld%lld",&x,&k);
			xg(1,x,k);
		} else {
			scanf("%lld%lld",&x,&y);
			if(x>y) swap(x,y);
			printf("%lld\n",qh(1,x,y));
		}
	}
	return 0;
}


标签:20,前缀,max,ll,mid,2022,ans,P4513,lld
From: https://www.cnblogs.com/yyx525jia/p/16711110.html

相关文章

  • 【HMS Core】使用视频编辑AI能力SDK报错2012
    ​问题描述在使用视频编辑AI能力SDK报错20128详细报错信息2022-09-0516:16:48.3065571-6445/cn.c7cloud.ShortVideoAlbumE/FileUtil:IOException:java.io.FileNotF......
  • 2022第五空间-web部分wp+复盘总结
    打了一天,麻了,大佬tql,这次get到了不少东西,一是一个不太常见的宽字节注入,我是真的没想到,而且后面也是看了wp理解了好一会才弄明白。0x01:题目是一个登录框,但是基本上是过滤......
  • Problem P20. [算法课蛮力法]种花问题
    我写的并不好,力扣上有比这更好的方法我的思路:从头遍历数组,检查位置是否能放下花,能放就放下,然后检查下一个位置,注意放下之后就改变了数组。然后就是注意前后数组越界,注意......
  • CSPS2021回文
    [CSP-S2021]回文题目描述给定正整数\(n\)和整数序列\(a_1,a_2,\ldots,a_{2n}\),在这\(2n\)个数中,\(1,2,\ldots,n\)分别各出现恰好\(2\)次。现在进行\(......
  • 九月加息75基本以成定局 年底终端利率将决定中期大选前风险市场走势 — 2022.9.20
    九月加息75基本以成定局年底终端利率将决定中期大选前风险市场走势—2022.9.20随着昨天晚上美股的走势BTC和ETH因为昨天上午开始出现的下跌恐慌情绪终于消散了一些,虽然......
  • 2022 CLion 中的Cygwin 配置(最全,最良心版)
    目录前景提要一、windows10安装Cygwin1.找到官网,进入官网,百度搜索或者点击下边链接.2.找到如图位置,双击下载3.下载完成后,找到下载的位置,双击exe文件.4.进入欢迎页界......
  • 20220911 CCPC 网络赛
    第一次正式参加xcpc比赛,三个人都好久没写代码了,导致一堆题写出来了没调出来,很下饭。ADoubtvsLie模拟题,直接模拟题意即可。CGuess手玩一下找下规律即可。HMutip......
  • 20220918 ICPC 网络赛
    过了8个题,比上一场稍微好点了,但是被过了一片的I卡住了,有点可惜。CDeltetetheTree首先可以发现几个简单的性质:操作过程中点的度数不会增加,shrink操作不改变其他点......
  • twinBASIC 更新:2022 年 9 月 18 日
    twinBASIC更新:2022年9月18日亮点包括PictureBox控件的初始实现和用twinBASIC编写的自定义Windows事件查看器。经过迈克·沃尔夫(在推特上连接:@NoLongerSe......
  • 2022.9.20 1005-1008
    1005#include<stdio.h>#include<stdlib.h>#include<math.h>intmain(){unsignedlonglongn;scanf("%llu",&n);unsignedlonglongm=(unsignedlonglong......