刚学线段树,样例 2 结果输出 10,Debug3小时无果,求助
查看原帖
刚学线段树,样例 2 结果输出 10,Debug3小时无果,求助
115947
huangx607087楼主2022/8/1 14:28
#include<bits/stdc++.h>
using namespace std;
long long n,tri[4640000],lazy[4640000],cazy[4640000];
const long long NOCAZY=0x9d9d9d9d9d9d9d9d;
void PushDown(int x,int a,int b)
{
	int mid=(a+b)/2;
	//cazy[2*x]=cazy[x];
	//cazy[2*x+1]=cazy[x];
	if(cazy[2*x]==NOCAZY)
	{
		tri[2*x]+=lazy[x];
		lazy[2*x]+=lazy[x];
	}
	else
	{
		//cazy[2*x]+=lazy[x];
		cazy[2*x]=cazy[x];
		tri[2*x]=cazy[x];
		
		//lazy[2*x]=0;
	}
	if(cazy[2*x+1]==NOCAZY)
	{
		tri[2*x+1]+=lazy[x];
		lazy[2*x+1]+=lazy[x];
	}
	else
	{
		cazy[2*x]=cazy[x];
		tri[2*x]=cazy[x];
		/*cazy[2*x+1]+=lazy[x];
		tri[2*x+1]=cazy[2*x+1];
		lazy[2*x+1]=0;*/
	}
	if(cazy[x]!=NOCAZY) tri[x]=cazy[x];
	cazy[x]=NOCAZY;
	lazy[x]=0;
} 
void ChangeEdge(int x,int a,int b,int l,int r,int k)
{
	int mid=(a+b)/2;
	if(a==l&&b==r)
	{
		tri[x]=k;
		cazy[x]=k;
		return;
	}
	PushDown(x,a,b); 
	if(cazy[x]!=NOCAZY)
		lazy[2*x]=lazy[2*x+1]=0;
	cazy[x]=NOCAZY;
	lazy[x]=0;
	if(mid<=l) ChangeEdge(2*x+1,mid,b,l,r,k);
	if(mid>=r) ChangeEdge(2*x,a,mid,l,r,k);
	if(mid>l&&mid<r)
	{
	
		ChangeEdge(2*x,a,mid,l,mid,k);
		ChangeEdge(2*x+1,mid,b,mid,r,k);
	}
	//tri[x]=tri[2*x]+tri[2*x+1];
	tri[x]=max(tri[2*x],tri[2*x+1]); 
}
void AddEdge(int x,int a,int b,int l,int r,int k)
{
	int mid=(a+b)/2;
	if(a==l&&b==r)
	{
		tri[x]+=k;
		return;
	}
	PushDown(x,a,b);
	//cazy[x]=1;
	if(mid<=l) AddEdge(2*x+1,mid,b,l,r,k);
	if(mid>=r) AddEdge(2*x,a,mid,l,r,k);
	if(mid>l&&mid<r)
	{
		AddEdge(2*x,a,mid,l,mid,k);
		AddEdge(2*x+1,mid,b,mid,r,k);
	}
	//tri[x]=tri[2*x]+tri[2*x+1];
	tri[x]=max(tri[2*x],tri[2*x+1]); 
} 
long long S(int x,int a,int b,int l,int r)
{
	int mid=(a+b)/2;
	if(a==l&&b==r) return tri[x];
	PushDown(x,a,b);
	int now;
	if(mid<=l) now=S(2*x+1,mid,b,l,r);
	if(mid>=r) now=S(2*x,a,mid,l,r);
	if(mid>l&&mid<r)
		now=max(S(2*x,a,mid,l,mid),S(2*x+1,mid,b,mid,r));
		//now=S(2*x,a,mid,l,mid)+S(2*x+1,mid,b,mid,r);
//	tri[x]=tri[2*x]+tri[2*x+1];
	tri[x]=max(tri[2*x],tri[2*x+1]); 
	return now;
}
void Debug()
{
	for(int i=1;i<=4*n;i++)
		printf("%lld ",tri[i]);
	puts("");
	for(int i=1;i<=4*n;i++)
		printf("%lld ",cazy[i]);
	for(int i=1;i<=4*n;i++)
		printf("%lld ",lazy[i]);
}
int main()
{
	memset(cazy,0x9d,sizeof(cazy));
	int T;
	scanf("%lld%d",&n,&T);
	for(int i=1;i<=n;i++)
	{
		long long x;
		scanf("%lld",&x);
		AddEdge(1,1,n+1,i,i+1,x);
	}
//	Debug();
	while(T--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			ChangeEdge(1,1,n+1,x,y+1,z);
		}
		if(op==2)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			AddEdge(1,1,n+1,x,y+1,z);
		}
		if(op==3)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			printf("%lld\n",S(1,1,n+1,x,y+1));
		}
	//	Debug();
	}
	return 0;
} 
2022/8/1 14:28
加载中...