社区讨论

萌新刚学oi,求助,不知道为啥一直输出0

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lo9blh29
此快照首次捕获于
2023/10/28 08:44
2 年前
此快照最后确认于
2023/10/28 08:44
2 年前
查看原帖
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
int tree[1000001];
int a[100001];
int n,m;
int x,y,k;
int sum;
void build(int o,int l,int r);
void update(int o,int l,int r);
void query(int o,int l,int r);
int main()
{
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(i=1;i<=12;i++)
	{
		printf("%d ",tree[i]);
	}
	printf("\n");
	for(i=1;i<=m;i++)
	{
		int lx;
		scanf("%d",&lx);
		if(lx==1)
		{
			scanf("%d%d%d",&x,&y,&k);
			update(1,1,n);
			for(j=1;j<=12;j++)
			{
				printf("%d ",tree[j]);
			}
			printf("\n");
		}
		else if(lx==2)
		{
			scanf("%d%d",&x,&y);
			sum = 0;
			query(1,1,n);
			printf("%d\n",sum);
		}
	}
}
void update(int o,int l,int r)
{
	if(l==r)
	{
		tree[o] += k;
		return;
	}
	tree[o] += k*(min(r,y)-max(l,x)+1);
	int m = (l+r)/2;
	if(m<=x)
	{
		update(o*2+1,m+1,r);
	}
	else if(m>y)
	{
		update(o*2,l,m);
	}
}
void query(int o,int l,int r)
{
	if(x<=l&&r<=y)
	{
//		printf("%d %d\n",l,r);
		sum+= tree[o];
		return;
	}
	int m = (l+r)/2;
	if(x<=m)
	{
		query(o*2,m+1,r);
	}
	if(y>=m)
	{
		query(o*2+1,l,m);
	}
}
void build(int o,int l,int r)
{
	if(l==r)
	{
	//	printf("%d\n",a[l]);
		tree[o] = a[l];
		return;
	}
	int m = (l+r)/2;
	build(o*2,l,m);
	build(o*2+1,m+1,r);
	tree[o] = tree[o*2] + tree[o*2+1];
}

回复

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

正在加载回复...