求助,玄关
查看原帖
求助,玄关
777597
David007楼主2024/8/3 14:38

WA 2~9,样例2没过,输出10

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,q,a[N],f[4*N],g[4*N],d[4*N];
void build(int root,int left,int right){
	if(left==right){
		f[root]=a[left];
		return ;
	}
	int mid=(left+right)/2;
	build(root*2,left,mid);
	build(root*2+1,mid+1,right);
	f[root]=max(f[root*2],f[root*2+1]);
	return ;
}
void p(int root,int left,int right){
	int mid=(left+right)/2;
	if(d[root]<1e9){
//		cout<<"!";
		d[root*2]=d[root];
		d[root*2+1]=d[root];
		f[root*2]=d[root]; 
		f[root*2+1]=d[root];
		g[root*2]=0;
		g[root*2+1]=0;
		d[root]=1e9+10;
	}
	if(g[root]!=0){
		g[root*2]+=g[root];
		g[root*2+1]+=g[root];
		f[root*2]+=g[root]; 
		f[root*2+1]+=g[root]; 
		g[root]=0;
	}
	return ;
}
void f1(int root,int left,int right,int qleft,int qright,int x){
	if(left>=qleft&&right<=qright){
		f[root]=x;
		d[root]=x;
		return ;
	}
	p(root,left,right);
	int mid=(left+right)/2;
	if(mid>=qright){
		f1(root*2,left,mid,qleft,qright,x);
	}
	else if(mid<qright){
		f1(root*2+1,mid+1,right,qleft,qright,x);
	}
	else{
		f1(root*2,left,mid,qleft,mid,x);
		f1(root*2+1,mid+1,right,mid+1,qright,x);
	}
//	cout<<"!";
	f[root]=max(f[root*2],f[root*2+1]);
	return ;
}
void f2(int root,int left,int right,int qleft,int qright,int x){
	if(qleft<=left&&qright>=right){
		f[root]+=(right-left+1)*x;
		g[root]+=x;
		return ;
	}
	int mid=(left+right)/2;
	p(root,left,right);
	if(mid>=qright){
		f2(root*2,left,mid,qleft,qright,x);
	}
	else if(mid+1<=qleft){
		f2(root*2+1,mid+1,right,qleft,qright,x);
	}
	else{
		f2(2*root,left,mid,qleft,mid,x);
		f2(2*root+1,mid+1,right,mid+1,qright,x);
	}
	f[root]=max(f[root*2],f[root*2+1]);
	return ;
}
int f3(int root,int left,int right,int qleft,int qright){
	if(left>=qleft&&right<=qright){
		return f[root];
	}
	p(root,left,right);
	int mid=(left+right)/2;
	if(mid>=qright){
		return f3(root*2,left,mid,qleft,qright);
	}
	else if(mid<qleft){
		return f3(root*2+1,mid+1,right,qleft,qright);
	}
	else{
		return max(f3(root*2,left,mid,qleft,mid),f3(root*2+1,mid+1,right,mid+1,qright));
	}
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	memset(d,0x7f,sizeof(d));
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int h;
		scanf("%lld",&h);
		if(h==1){
			int l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			f1(1,1,n,l,r,x);
		}
		else if(h==2){
			int l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			f2(1,1,n,l,r,x);
		}
		else{
			int l,r;
			scanf("%lld%lld",&l,&r);
			cout<<f3(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}
2024/8/3 14:38
加载中...