树状数组全WA求调
查看原帖
树状数组全WA求调
1379306
Furinaaaa楼主2024/6/29 16:43

样例运行正常,但测试全WA

#define _CRT_SECURE_NO_WARNINGS

using namespace std ;

#include <iostream>

typedef long long U ;


//lowbit函数
//x-lowbit(x)跳到下一个树状数组节点
//x+lowbit(x)跳到上一个树状数组节点
U lowbit(U x)
{
	return x & -x ; 
}

//s[i]记录前i项的值
//因为tree[x] = ∑[ x - lowbit(x) + 1 , x],
//所以可以用s[x] - s[ x - lowbit(x)]表示tree[x]
U s[600000] ; 

//tree[x]记录[x-lowbit[x]+1,x]的所有和
U tree[600000] ; 

//单点修改
//limit表示最大上限,即树的顶端
void change(U x, U add , U limit )
{
	for (U i = x; i < limit; i += lowbit(i))
	{
		tree[i] += add ; 
	}
}

//区间查询
//返回[1,x]所有项的和
U search(U x)
{
	U ans = 0 ;
	for (U i = x; i >= 1 ; i -= lowbit(i))
	{
		ans += tree [i] ; 
	}
	return ans ; 
}



int main()
{
	U n , m ;
	cin >> n >> m ;

	//初始化
	for (U i = 0; i <= n + 12; i++)
	{
		s[i] = 0 ; 
	}
	//输入数据
	for (U i = 1; i <= n; i++)
	{
		U a ;
		cin >> a ; 
		//更新前i项和
		if (i == 1)
		{
			s[i] = a ;
		}
		else
		{
			s[i] = s[i - 1] + a;
		}
	}
	//初始化tree数组
	for (U i = 1; i <= n; i++)
	{
		tree[i] = s[i] - s[i-lowbit(i) ] ;
	}

	//操作
	U code , x , y ; 
	for (U i = 0; i < m; i++)
	{
		cin >> code >> x >> y ; 
		if (code == 1)
		{
			change( x , y , n ) ;
		}
		else
		{
			cout << search( y ) - search(x-1) << endl ; 
		}
	}

	return 0; 
}
2024/6/29 16:43
加载中...