奇怪,本地出数据是正常的提交出的数据就是错的
查看原帖
奇怪,本地出数据是正常的提交出的数据就是错的
1420936
Sparkle_ovo楼主2025/6/28 22:46

RT

#include<iostream>
using namespace std;
const int N=1000010;
const int fx=-(1e9+10);
typedef long long ll;
ll t_add[N],t_change[N],t_max[N];
ll a[N];
void push(int l,int r,int pos) {
	int mid=(l+r)>>1;
	int ls=pos<<1;
	int rs=pos<<1|1;
	if(t_change[pos]!=fx) {
		t_change[ls]=t_change[pos];
		t_change[rs]=t_change[pos];
		t_add[ls]=0;
		t_add[rs]=0;
		t_max[ls]=t_change[pos];
		t_max[rs]=t_change[pos];
		t_change[pos]=fx;
	}

	t_add[ls]+=t_add[pos];
	t_add[rs]+=t_add[pos];
	t_add[pos]=0;
}
void chan(int l,int r,int cl,int cr,int pos,int cv) {
//	if(l==r){
//		t_max[pos]=cv;
//	}
	if(cl<=l&&r<=cr) {
		t_add[pos]=0;
		t_max[pos]=cv;
		t_change[pos]=cv;
		return ;
	}
	int mid=(l+r)>>1;
	push(l,r,pos);
	if(cl<=mid)
		chan(l,mid,cl,cr,pos<<1,cv);
	if(cr>mid)
		chan(mid+1,r,cl,cr,pos<<1|1,cv);
	t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
}
void add(int l,int r,int al,int ar,int pos,int av) {
	if(al<=l&&r<=ar) {
		t_add[pos]+=av;
//		t_max[pos]+=t_add[pos];
//		t_add[pos]=0;
		return ;
	}
	int mid=(l+r)>>1;
	push(l,r,pos);
	if(al<=mid)
		add(l,mid,al,ar,pos<<1,av);
	if(ar>mid)
		add(mid+1,r,al,ar,pos<<1|1,av);
	t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
}
void build(int l,int r,int pos) {
	if(l==r) {
		t_max[pos]=a[l];
		t_change[pos]=fx;
		t_add[pos]=0;
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,pos<<1);
	build(mid+1,r,pos<<1|1);
	t_max[pos]=max(t_max[pos<<1],t_max[pos<<1|1]);
	t_add[pos]=0;
	t_change[pos]=fx;
	return ;
}
ll ss(int l,int r,int sl,int sr,int pos) {
	if(l==r) {
		if(t_change[pos]!=fx) t_max[pos]=t_change[pos];
		t_max[pos]+=t_add[pos];
		t_add[pos]=0;
		return t_max[pos];
	}
	if(sl<=l&&r<=sr) {
		push(l,r,pos);
		t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
		return t_max[pos];
	}
	int mid=(l+r)>>1;
	push(l,r,pos);
	ll ans;
	if(sl<=mid)
		ans=ss(l,mid,sl,sr,pos<<1);
	if(sr>mid)
		ans=max(ss(mid+1,r,sl,sr,pos<<1|1),ans);
	t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
	return ans;
}
int main() {
	int n,m;
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		scanf("%d",a+i);
	}
	build(1,n,1);
	while(m--) {
		int opt;
		scanf("%d",&opt);
		int l,r;
		scanf("%d %d",&l,&r);
		if(opt==1) {
			int cc;
			cin>>cc;
			chan(1,n,l,r,1,cc);
			continue;
		}
		if(opt==2) {
			int aa;
			cin>>aa;
			add(1,n,l,r,1,aa);
			continue;
		}
		if(opt==3) {
			cout<<ss(1,n,l,r,1)<<endl;
		}
	}
	return 0;
}
2025/6/28 22:46
加载中...