萌新刚学oi,求助线段树,样例没过
查看原帖
萌新刚学oi,求助线段树,样例没过
758178
fffkc03楼主2023/4/20 20:10
#include<bits/stdc++.h>
#define int long long
#define ls i<<1
#define rs i<<1|1
using namespace std;
struct ccc{
	int laz,mu,pre,maxn,minn;
}tree[1000000*4];
int a[1000000*4];
int k;
void tag(int i,int l,int r){
	int mid=(l+r)>>1;
	tree[ls].pre*=tree[i].mu;
	tree[rs].pre*=tree[i].mu;
	tree[ls].pre+=(mid-l+1)*tree[i].laz;
	tree[rs].pre+=(r-mid)*tree[i].laz;
	tree[ls].mu*=tree[i].mu;
	tree[rs].mu*=tree[i].mu;
	tree[ls].laz*=tree[i].mu;
	tree[rs].laz*=tree[i].mu;
	tree[ls].laz+=tree[i].laz;
	tree[rs].laz+=tree[i].laz;
	tree[ls].maxn*=tree[i].mu;
	tree[rs].maxn*=tree[i].mu;
	tree[ls].maxn+=tree[i].laz;
	tree[rs].maxn+=tree[i].laz;
	tree[ls].minn*=tree[i].mu;
	tree[rs].minn*=tree[i].mu;
	tree[ls].minn+=tree[i].laz;
	tree[rs].minn+=tree[i].laz;
	tree[i].laz=0;
	tree[i].mu=1;
}
void build(int i,int l,int r){
	tree[i].mu=1;
	if(l==r){
		tree[i].pre=tree[i].maxn=tree[i].minn=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	tree[i].pre=tree[ls].pre+tree[rs].pre;
	tree[i].maxn=max(tree[ls].maxn,tree[rs].maxn);
	tree[i].minn=min(tree[ls].minn,tree[rs].minn);
}
void change_add (int i,int l,int r,int x,int y,int z){
	if(x<=l&&y>=r){
		tree[i].pre+=(r-l+1)*z;
		tree[i].laz+=z;
		return ;
	}
	tag(i,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) change_add(ls,l,mid,x,y,z);
	if(y>mid) change_add(rs,mid+1,r,x,y,z);
	tree[i].pre=tree[ls].pre+tree[rs].pre;
	tree[i].maxn=max(tree[ls].maxn,tree[rs].maxn);
	tree[i].minn=min(tree[ls].minn,tree[rs].minn);
}
void change_mu (int i,int l,int r,int x,int y,int z){
	if(x<=l&&y>=r){
		tree[i].pre*=z;
		tree[i].laz*=z;
		tree[i].mu*=z;
		return ;
	}
	tag(i,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) change_mu(ls,l,mid,x,y,z);
	if(y>mid) change_mu(rs,mid+1,r,x,y,z);
	tree[i].pre=tree[ls].pre+tree[rs].pre;
	tree[i].maxn=max(tree[ls].maxn,tree[rs].maxn);
	tree[i].minn=min(tree[ls].minn,tree[rs].minn);
}
int get(int i,int l,int r,int x,int y){
	if(x<=l&&y>=r)return tree[i].pre;
	int ans=0;
	int mid=(l+r)>>1;
	if(x<=mid) ans+=get(ls,l,mid,x,y);
	if(y>mid) ans+=get(rs,mid+1,r,x,y);
	return ans;
}
signed main(){
	int n,m;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	int opt;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>opt;
		int x,y,z;
		if(opt==1){
			cin>>x>>y>>z;
			change_mu(1,1,n,x,y,z);
		}
		else if(opt==2){
			cin>>x>>y>>z;
			change_add(1,1,n,x,y,z);
		}
		else{
			cin>>x>>y;
			cout<<get(1,1,n,x,y);
			puts("");
		}
	}
	return 0;
}
2023/4/20 20:10
加载中...