mx求助一道大水题
  • 板块学术版
  • 楼主暗影之梦
  • 当前回复16
  • 已保存回复16
  • 发布时间2022/8/10 08:41
  • 上次更新2023/10/27 16:11:38
查看原帖
mx求助一道大水题
382274
暗影之梦楼主2022/8/10 08:41

mx花几分钟用树状数组写了这一道水题后发现意外溢出(似乎是),自己输出debug时发现不知道为什么树状数组在没有被访问过(就是都是 00 )时进行增加操作会使当前会访问的所有节点重新随机化为负数。

举个例子,就像要将节点1增加时,上一个询问都还全是 001,2,4,81,2,4,8 位置的数组值都全部变成了 18245566534254592-18245566534254592

附自己代码:

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n,k,a[500001];
int lowbit(int x)
{
	return x&(-x);
}
void add(int nw,int x)
{
//	cout<<nw<<" "<<x<<endl;
//	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
//	cout<<endl;
	for(int i=nw;i<=n;i+=lowbit(i)) a[i]+=x;
}
void mnu(int nw,int x)
{
	for(int i=nw;i<=n;i+=lowbit(i)) a[i]-=x;
}
int cal(int x)
{
	int ans=0;
	for(int i=x;i;i-=lowbit(i)) ans+=a[i];
	return ans;
}
signed main()
{
	scanf("%lld%lld",&n,&k);
//	for(int i=1;i<=n;i++) cout<<i<<" "<<a[i]<<endl; 
	for(int i=1;i<=k;i++)
	{
		char c;
		int m,p;
		scanf("%c",&c);
//		for(int j=1;j<=n;j++) cout<<a[j]<<" ";
//		cout<<endl;
		if(c=='A')
		{
			scanf("%lld",&m);
			printf("%lld\n",cal(m));
		}else if(c=='B')
		{
			scanf("%lld%lld",&m,&p);
//			cout<<m<<" "<<p<<" "<<c<<endl;
			add(m,p);
		}else
		{
			scanf("%lld%lld",&m,&p);
			mnu(m,p);
		}
	}
	return 0;
}
2022/8/10 08:41
加载中...