线段树板子60pts求调
查看原帖
线段树板子60pts求调
461616
Judgelight楼主2023/4/5 22:40

WA1,2,9,10

但是真的是模板啊。

#include<bits/stdc++.h>
#define int long long
#define N 100009
using namespace std;
int n,m,a[N];
struct Node{
	int l,r,maxx1,maxx2,add1,add2,tobe1,tobe2;
}tr[N*4];
void pushup(int u){
	tr[u].maxx1=max(tr[u<<1].maxx1,tr[u<<1|1].maxx1);
	tr[u].maxx2=max(tr[u<<1].maxx2,tr[u<<1|1].maxx2);
}
void eval(Node &t,int add1,int add2,int tobe1,int tobe2){
	t.maxx2=max(t.maxx2,tobe2);
	t.tobe2=max(t.tobe2,tobe2);
	t.maxx2=max(t.maxx2,t.maxx1+add2);
	t.add2=max(t.add2,t.add1+add2);
	if(tobe1!=-1e18){
		t.maxx1=tobe1;
		t.add1=0;
		t.tobe1=tobe1;
	}
	t.maxx1+=add1;
	t.add1+=add1;
}
void pushdown(int u){
	eval(tr[u<<1],tr[u].add1,tr[u].add2,tr[u].tobe1,tr[u].tobe2);
	eval(tr[u<<1|1],tr[u].add1,tr[u].add2,tr[u].tobe1,tr[u].tobe2);
	tr[u].add1=tr[u].add2=0,tr[u].tobe1=tr[u].tobe2=-1e18;
}
void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r,tr[u].maxx1=tr[u].maxx2=-1e18,tr[u].add1=tr[u].add2=0,tr[u].tobe1=tr[u].tobe2=-1e18;
	if(l==r){
		tr[u].maxx1=tr[u].maxx2=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify_add(int u,int l,int r,int x){
	if(tr[u].l>=l&&tr[u].r<=r){
		eval(tr[u],x,x,-1e18,-1e18);
		return ;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid){
		modify_add(u<<1,l,r,x);
	}
	if(r>mid){
		modify_add(u<<1|1,l,r,x);
	}
	pushup(u);
}
void modify_tobe(int u,int l,int r,int x){
	if(tr[u].l>=l&&tr[u].r<=r){
		eval(tr[u],0,0,x,x);
		return ;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid){
		modify_tobe(u<<1,l,r,x);
	}
	if(r>mid){
		modify_tobe(u<<1|1,l,r,x);
	}
	pushup(u);
}
int query_max1(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].maxx1;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1,ans=-1e18;
	if(l<=mid){
		ans=max(ans,query_max1(u<<1,l,r));
	}
	if(r>mid){
		ans=max(ans,query_max1(u<<1|1,l,r));
	}
	return ans;
}
int query_max2(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].maxx2;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1,ans=-1e18;
	if(l<=mid){
		ans=max(ans,query_max2(u<<1,l,r));
	}
	if(r>mid){
		ans=max(ans,query_max2(u<<1|1,l,r));
	}
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
		char op;
		int x,y,z;
		cin>>op;
		if(op=='Q'){
			cin>>x>>y;
			cout<<query_max1(1,x,y)<<endl;
		}
		else if(op=='A'){
			cin>>x>>y;
			cout<<query_max2(1,x,y)<<endl;
		}
		else if(op=='P'){
			cin>>x>>y>>z;
			modify_add(1,x,y,z);
		}
		else{
			cin>>x>>y>>z;
			modify_tobe(1,x,y,z);
		}
	}
	return 0;
}
2023/4/5 22:40
加载中...