社区讨论

萌新线段树 9分 求助

P4513小白逛公园参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8jqsxl
此快照首次捕获于
2023/10/27 19:45
2 年前
此快照最后确认于
2023/10/27 19:45
2 年前
查看原帖
只对了#1
调了一上午也不明白哪里出问题了qwq
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10,Inf=9223372036854775807;
char cch;
int res,zf;
inline int rd()
{
	while((cch=getchar())<45);
	if(cch^45)res=cch^48,zf=1;
	else res=0,zf=-1;
	while((cch=getchar())>=48)res=(res*10)+(cch^48);
	return res*zf;
}

int n=rd(),T=rd();
struct Tree
{
	int l,r;
	int mx,mxl,mxr;
	int sum;
}t[N<<2];

inline void pushup(int u)
{
	t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
	t[u].mx=max(max(t[u<<1].mx,t[u<<1|1].mx),t[u<<1].mxr+t[u<<1|1].mxl);
	t[u].mxl=max(t[u<<1].mxl,t[u<<1].sum+t[u<<1|1].mxl);
	t[u].mxr=max(t[u<<1|1].mxr,t[u<<1|1].sum+t[u<<1].mxr);
}

inline void build(int u,int l,int r)
{
	t[u].l=l,t[u].r=r;
	if(l==r)
	{
		t[u].sum=t[u].mx=t[u].mxl=t[u].mxr=rd();
		return;
	}
	int mid=(t[u].l+t[u].r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}

inline void update(int u,int p,int k)
{
	if(t[u].l==t[u].r)
	{
		t[u].sum=t[u].mx=t[u].mxl=t[u].mxr=k;
		return;
	}
	int mid=(t[u].l+t[u].r)>>1;
	if(mid>=p) update(u<<1,p,k);
	else update(u<<1|1,p,k);
	pushup(u);
}

inline int query(int u,int l,int r)
{
	if(l<=t[u].l&&r>=t[u].r) return t[u].mx;
	int mid=(t[u].l+t[u].r)>>1,mx=-Inf;
	if(l<=mid) mx=query(u<<1,l,r);
	if(r>mid) mx=max(mx,query(u<<1|1,l,r));
	return mx;
}

int opt;
int kl,kr;
signed main()
{
	build(1,1,n);
	while(T--)
	{
		opt=rd();
		kl=rd(),kr=rd();
		switch(opt)
		{
			case 1:if(kl>kr)swap(kl,kr);cout<<query(1,kl,kr)<<'\n';break;
			case 2:update(1,kl,kr);break;
		}
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...