社区讨论

10pts求调

P3372【模板】线段树 1参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lriy221k
此快照首次捕获于
2024/01/18 16:22
2 年前
此快照最后确认于
2024/01/18 19:45
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

const int M=500005;
int n,m;
int ls[M];
int ans;
struct nood
{
	int l,r;
	int mx;
	int add;
	int bj;
}tree[4*M+5];

int read()//
{
	int x=0,w=1;
	char ch=0;
	while(ch<'0'||ch>'9')
	{
    	if(ch=='-')
		{
			w=-1;
		}
    	ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
    	x=x*10+(ch-'0');
    	ch=getchar();
	}
	return x*w;
}

void Pushdown(int k)//
{ 	
	if(tree[k].bj!=0)
	{
		tree[k*2].bj+=tree[k].bj;
		tree[k*2+1].bj+=tree[k].bj;
		tree[k*2].add+=(tree[k*2].r-tree[k*2].l+1)*tree[k].bj;
		tree[k*2+1].add+=(tree[k*2+1].r-tree[k*2+1].l+1)*tree[k].bj;
		tree[k].bj=0;
	}
}

void build(int x,int y,int k)
{
	tree[k].l=x;
	tree[k].r=y;
	tree[k].add=0;
	tree[k].bj=0;
	if(x==y)
	{
		tree[k].add=ls[x];
		return;
	}
	int mid=(x+y)/2;
	build(x,mid,2*k);
	build(mid+1,y,2*k+1);
	tree[k].add=tree[k*2].add+tree[k*2+1].add;
}

void ask(int k,int l,int r)
{
	if(r<tree[k].l||l>tree[k].r)
	{
		return;
	}
	if(tree[k].bj!=0)
	{
//		cout<<"Ok"<<endl;
		Pushdown(k);
	}
	if(l<=tree[k].l&&r>=tree[k].r)
	{
		ans+=tree[k].add;
//		cout<<k<<" "<<tree[k].add;
		return;
	}
	ask(2*k,l,r);
	ask(2*k+1,l,r);
}

void add(int k,int a,int b,int d)
{
	if(b<tree[k].l||a>tree[k].r)
	{
		return;
	}
	if(tree[k].bj!=0)
	{
		tree[k].bj+=d;
		return;
	}
	if(a<=tree[k].l&&b>=tree[k].r)
	{
		tree[k].bj=d;
		tree[k].add=tree[k].add+(tree[k].r-tree[k].l+1)*d;
		return;
	}
	Pushdown(k);
	add(2*k,a,b,d);
	add(2*k+1,a,b,d);
	tree[k].add=tree[k*2].add+tree[k*2+1].add;
}

int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	{
		cin>>ls[i];
	}
	build(1,n,1);
	int www;
//	while(cin>>www)
//	{
//		cout<<tree[www].l<<" "<<tree[www].r<<" "<<tree[www].add<<endl;
//	}
	for(int i=1;i<=m;i++)
	{
		int T;
		int a,b;
		T=read();
		if(T==2)
		{
			a=read();
			b=read();
			ans=0;
			ask(1,a,b);
			cout<<ans<<endl;
		}
		else
		{
			a=read();
			b=read();
			int k;
			k=read();
			add(1,a,b,k);
		}
	}
	return 0;
}
/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
*/

回复

1 条回复,欢迎继续交流。

正在加载回复...