TLE #3 求调
查看原帖
TLE #3 求调
1054001
_Lazy_zhr_楼主2024/8/23 10:16

rt,另外这个点的数据和样例2一样,在本地跑也不慢。

#include<bits/stdc++.h>
using namespace std;
#define ls rt<<1
#define rs rt<<1|1
long long n,q,a[1000005];
struct node{ long long tr,cover,add; } tree[4000005];
inline void push_up(int rt){ tree[rt].tr=max(tree[ls].tr,tree[rs].tr); }
inline void cover_down(int rt){
	if(tree[rt].cover!=INT_MIN){
		tree[ls].add=tree[rs].add=0;
		tree[ls].tr=tree[rs].tr=tree[rt].cover;
		tree[ls].cover=tree[rs].cover=tree[rt].cover;
		tree[rt].cover=INT_MIN;
	}
}
inline void add_down(int rt){
	if(tree[rt].add){
		cover_down(rt);
		tree[ls].tr+=tree[rt].add,tree[rs].tr+=tree[rt].add;
		tree[ls].add+=tree[rt].add,tree[rs].add+=tree[rt].add;
		tree[rt].add=0;
	}
}
inline void push_down(int rt){ cover_down(rt),add_down(rt); }
void build(int rt,int l,int r){
	if(l==r){
		tree[rt].tr=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	push_up(rt);
}
inline void cover_change(int rt,int l,int r,int x,int y,long long k){
	if(l==x&&r==y){
		tree[rt].add=0;
		tree[rt].tr=tree[rt].cover=k;
		return ;
	}
	push_down(rt);
	int mid=(l+r)>>1;
	if(y<=mid) cover_change(ls,l,mid,x,y,k);
	else if(mid<x) cover_change(rs,mid+1,r,x,y,k);
	else cover_change(ls,l,mid,x,mid,k),cover_change(rs,mid+1,r,mid+1,y,k);
	push_up(rt);
}
inline void add_change(int rt,int l,int r,int x,int y,long long k){
	if(l==x&&r==y){
		cover_down(rt);
		tree[rt].tr+=k;
		tree[rt].add+=k;
		return ;
	}
	push_down(rt);
	int mid=(l+r)>>1;
	if(y<=mid) add_change(ls,l,mid,x,y,k);
	else if(mid<x) add_change(rs,mid+1,r,x,y,k);
	else add_change(ls,l,mid,x,mid,k),add_change(rs,mid+1,r,mid+1,y,k);
	push_up(rt);
}
inline long long calc(int rt,int l,int r,int x,int y){
	if(l==x&&r==y) return tree[rt].tr;
	push_down(rt);
	int mid=(l+r)>>1;
	if(y<=mid) return calc(ls,l,mid,x,y);
	else if(x>mid) return calc(rs,mid+1,r,x,y);
	else return max(calc(ls,l,mid,x,mid),calc(rs,mid+1,r,mid+1,y));
}
inline long long read(){
	long long x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') if(ch=='-'){ f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
	return f*x;
}
int main(){
	n=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	for(int i=1;i<=n*4;i++) tree[i].cover=INT_MIN;
	while(q--){
		long long opt=read(),x=read(),y=read(),k;
		if(opt<3){
			k=read();
			if(opt==1) cover_change(1,1,n,x,y,k);
			else add_change(1,1,n,x,y,k);
		}
		else printf("%lld\n",calc(1,1,n,x,y));
	}
	return 0;
}

码风清奇求放过。

2024/8/23 10:16
加载中...