60分后四点wa求助
查看原帖
60分后四点wa求助
1247656
shy111楼主2024/6/16 15:54

代码如下

#include<bits/stdc++.h>
using namespace std;
#define none -1e17
typedef long long ll;
const int N=1e7+10;
//struct+lazy 
struct tree{
	ll mx,add,cov;
};
tree tr[4*N];
ll a[N],n,q;
void bui(int id,int l,int r){
	tr[id].add=0;
	tr[id].cov=none;
	if(l==r){
		tr[id].mx=a[l];
		return ;
	}
	int mid=(l+r)/2;
	bui(id*2,l,mid);
	bui(id*2+1,mid+1,r);
	tr[id].mx=max(tr[id*2].mx,tr[id*2+1].mx);
	return ;
}
void push_up(int id){
	tr[id].mx=max(tr[id*2].mx,tr[id*2+1].mx);
}
// 维护lazy_tag 
void adddown(int id,int l,int r){
	tr[id*2].mx=tr[id*2].mx+tr[id].add;
	tr[id*2+1].mx=tr[id*2+1].mx+tr[id].add;
	tr[id*2].add=(tr[id*2].add+tr[id].add);
	tr[id*2+1].add=(tr[id*2+1].add+tr[id].add);
	tr[id].add=0;
	return ;
}
void covdown(int id,int l,int r){
	if(tr[id].cov!=none){
		tr[id*2].mx=tr[id].cov;
		tr[id*2+1].mx=tr[id].cov;
		tr[id*2].cov=tr[id].cov;
		tr[id*2+1].cov=tr[id].cov;
		tr[id].add=0;
		tr[id*2].add=tr[id].add;
		tr[id*2+1].add=tr[id].add;
		tr[id].cov=none;
	}
} 
void push_down(int id,int l,int r){
	covdown(id,l,r);
	adddown(id,l,r);
}
void add(int id,int l,int r,int x,int y,int k){
    if(x<=l and r<=y){
    	tr[id].mx+=k;
		tr[id].add+=k;
		return ;
	}
	push_down(id,l,r);
	int mid=(l+r)/2;
	if(x<=mid) add(id*2,l,mid,x,y,k);
	if(y>mid) add(id*2+1,mid+1,r,x,y,k);
	push_up(id);
}
void cov(int id,int l,int r,int x,int y,int k){
	if(x<=l and r<=y){
		tr[id].mx=k;
		tr[id].cov=k;
		return;
	}
	push_down(id,l,r);
	int mid=(l+r)/2;
	if(x<=mid) cov(id*2,l,mid,x,y,k);
	if(y>mid) cov(id*2+1,mid+1,r,x,y,k);
	push_up(id);
}
ll find_(int id,int l,int r,int x,int y){
	if(x<=l and r<=y) return tr[id].mx;
	push_down(id,l,r);
	ll mid=(l+r)/2,ans=none;
	if(x<=mid)ans=max(ans,find_(id*2,l,mid,x,y));
	if(y>mid) ans=max(ans,find_(id*2+1,mid+1,r,x,y));
	return ans;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	bui(1,1,n);
	int op,x,y,k;
	for(int i=1;i<=q;i++){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			cov(1,1,n,x,y,k);
		}
		else if(op==2){
			cin>>k;
			add(1,1,n,x,y,k);
		}
		else{
			cout<<find_(1,1,n,x,y)<<"\n";
		}
	}
	return 0;
}

求助!

2024/6/16 15:54
加载中...