求助线段树写树状数组2wwwww
  • 板块学术版
  • 楼主Speccial
  • 当前回复10
  • 已保存回复10
  • 发布时间2021/9/29 18:43
  • 上次更新2023/11/4 05:22:39
查看原帖
求助线段树写树状数组2wwwww
361840
Speccial楼主2021/9/29 18:43

萌新学线段树,想用线段树A掉树状数组,但是debug实在找不出来了,求大佬debug/kk

我尽量都用注释写出代码要做啥了,求大佬帮下忙qwq

测试结果:都WA了

#include<cstdio>

const int qwq =500010;

using namespace std;

int n,m,opt;
int a[qwq];
long long ans;


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

struct TREE//结构体建树
{
	int l,r;
	int sum;
}tree[qwq<<2];

void pushup_sum(int i)//维护子节点与父节点的关系
{
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}

void build(int i,int l,int r)//递归建树
{
	tree[i].l=l;tree[i].r=r;
	if(l==r)
	{
		tree[i].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	pushup_sum(i);
}

void add(int i,int l,int r,int k)//区间修改
{
	if(l<=tree[i].l && tree[i].r<=r)//如果完全被包含就直接修改
	{
		tree[i].sum+=k;
		return;
	}
	if(l<=tree[i<<1].r)add(i<<1,l,r,k);//如果左子树可以修改
	if(tree[i<<1|1].l<=r)add(i<<1|1,l,r,k);//如果右子树可以修改
}

void query(int i,int dis)
{
	ans+=tree[i].sum;
	if(tree[i].l==tree[i].r)//如果是叶子节点
		return;
	if(dis<=tree[i<<1].r)query(i<<1,dis);//如果这点在左子树
	if(tree[i<<1|1].l<=dis)query(i<<1|1,dis);//如果这点在右子树
}

int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
    for(int i=1;i<=m;i++)
    {
    	opt=read();
    	if(opt==1)
    	{
    		int x=read(),y=read(),k=read();
    		add(1,x,y,k);
    	}
    	else if(opt==2)
    	{
    		int x=read();
    		query(1,x);
    		printf("%lld\n",ans);
    	}
    }
    return 0;
}
2021/9/29 18:43
加载中...