样例不过但AC了,求调
查看原帖
样例不过但AC了,求调
1004026
__Charlie_Chen__楼主2024/7/13 16:03

线段树裸题 代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long 
const int maxn=2e5+10;
struct node{
	int l,r,laz;
	ll dat,laz2;
}tr[4*maxn];
int a[maxn];
int n,m;

inline int r();
void build(int root,int l,int r);
void change(int root,int u,int k);
void change2(int root,int l,int r,int k);
ll ask(int root,int l,int r);
ll ask2(int root,int u);
void spread(int root);

signed main(){
	n=r(),m=r();
	for(int i=1;i<=n;i++) a[i]=r();
	build(1,1,n);
	while(m--){
		int u=r();
		if(u==1){
			int x=r(),y=r(),k=r();
			change2(1,x,y,k);
		}else if(u==2){
			int k=r();
			change(1,1,k);
		}else if(u==3){
			int k=r();
			change(1,1,-1*k);
		}else if(u==4){
			int x=r(),y=r();
			printf("%lld\n",ask(1,x,y));
		}else if(u==5){
			printf("%lld\n",ask2(1,1));
		}
	} 
	return 0;
}

void build(int root,int l,int r){
	tr[root].l=l,tr[root].r=r;
	if(l==r){
		tr[root].dat=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*root,l,mid);
	build(2*root+1,mid+1,r);
	tr[root].dat=tr[2*root].dat+tr[2*root+1].dat;
}

void spread(int root){
	if(tr[root].laz){
		tr[2*root].dat+=(tr[2*root].r-tr[2*root].l+1)*tr[root].laz;
		tr[2*root+1].dat+=(tr[2*root+1].r-tr[2*root+1].l+1)*tr[root].laz;
		tr[2*root].laz+=tr[root].laz;
		tr[2*root+1].laz+=tr[root].laz;
		tr[root].laz=0;
	}
}

void change2(int root,int l,int r,int k){
	if(l<=tr[root].l&&tr[root].r<=r){
		tr[root].dat+=(tr[root].r-tr[root].l+1)*k;
		tr[root].laz+=k;
		return ;
	}
	spread(root);
	int mid=(tr[root].l+tr[root].r)/2;
	if(l<=mid) change2(2*root,l,r,k);
	if(r>mid) change2(2*root+1,l,r,k);
	tr[root].dat=tr[2*root].dat+tr[2*root+1].dat;
}

ll ask2(int root,int u){
	if(tr[root].l==tr[root].r) return tr[root].dat;
	spread(root);
	int mid=(tr[root].l+tr[root].r)/2;
	ll ans=0;
	if(u<=mid) ans+=ask2(2*root,u);
	else ans+=ask2(2*root+1,u);
	return ans;
}

ll ask(int root,int l,int r){
	if(l<=tr[root].l&&tr[root].r<=r) return tr[root].dat;
	spread(root);
	int mid=(tr[root].l+tr[root].r)/2;
	ll ans=0;
	if(l<=mid) ans+=ask(2*root,l,r);
	if(r>mid) ans+=ask(2*root+1,l,r);
	return ans;
}

void change(int root,int u,int k){
	if(tr[root].l==tr[root].r){
		tr[root].dat+=k;
		return;
	}
	int mid=(tr[root].l+tr[root].r)/2;
	if(u<=mid) change(2*root,u,k);
	else change(2*root+1,u,k);
	tr[root].dat=tr[2*root].dat+tr[2*root+1].dat;
}

inline int r(){
	int 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-48;ch=getchar();}
	return x*f;
}
2024/7/13 16:03
加载中...