有趣的线段树调代码时间~~~
查看原帖
有趣的线段树调代码时间~~~
1015796
Lingyu_fly楼主2024/7/16 16:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,f;
int a[N];
struct tr{
	int l,r,sum,lazy;
}tree[N*4];
void pushup(int u){
	tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;
}
void build(int u,int l,int r){
	tree[u].l=l;tree[u].r=r;
	if(l==r){
		tree[u].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void pushdown(int u){
	if(tree[u].lazy){
		tree[u<<1].sum+=(tree[u<<1].r-tree[u<<1].l+1)*tree[u].lazy;
		tree[u<<1|1].sum+=(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].lazy;
		tree[u<<1].lazy+=tree[u].lazy;
		tree[u<<1|1].lazy+=tree[u].lazy;
		tree[u].lazy=0;
	}
}
void modify(int u,int l,int r,int k){
	if(l<=tree[u].l&&tree[u].r<=r){
		tree[u].sum+=(tree[u].r-tree[u].l+1)*k;
		tree[u].lazy+=k;
		return;
	}
	pushdown(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	if(l<=mid) modify(u<<1,l,r,k);
	if(mid<r) modify(u<<1|1,l,r,k);
	pushup(u);
}
void modify_dan(int u,int x,int k,int op){
	if(tree[u].l==tree[u].r){
		if(op) tree[u].sum+=k;
		else tree[u].sum-=k;
		return;
	}
	pushdown(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	if(x<=mid) modify_dan(u<<1,x,k,op);
	else modify_dan(u<<1|1,x,k,op);
	pushup(u);
}
int query(int u,int l,int r){
	if(l<=tree[u].l&&tree[u].r<=r){
		return tree[u].sum;
	}
	pushdown(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	int ans=0;
	if(l<=mid) ans+=query(u<<1,l,r);
	if(mid<r) ans+=query(u<<1|1,l,r);
	return ans;
}
int query_dan(int u,int x){
	if(tree[u].l==tree[u].r){
		return tree[u].sum;
	}
	pushdown(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	if(x<=mid) return query_dan(u<<1,x);
	else return query_dan(u<<1|1,x);
}
signed main(){
	scanf("%lld%lld",&n,&f);
	for(int i=1;i<=n;i++) scanf("%lld",a+i);
	build(1,1,n);
	while(f--){
		int op,x,y,k;
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld",&x,&y,&k);
			modify(1,x,y,k);
		}else if(op==2){
			scanf("%lld",&k);
			modify_dan(1,1,k,1);
		}else if(op==3){
			scanf("%lld",&k);
			modify_dan(1,1,k,0);
		}else if(op==4){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,x,y));           
		}else if(op==5){
			scanf("%lld",&x);
			printf("%lld\n",query_dan(1,x));
		}
	}
	return 0;
}

本人已经阵亡了,求打捞康康! orz

-(qwq)-

2024/7/16 16:46
加载中...