求解,为什么这道题用树状数组不行
查看原帖
求解,为什么这道题用树状数组不行
55007
Wu2406楼主2021/10/2 21:18

实在想不明白,为什么这道题用树状数组不行。

使树状数组每个管理小组成员c[i]直接记录其所有子节点的积。先赋值c[i]均为1。接着每次输入a[i],并将所有后继节点(i+lowbit(i))乘以a[i]。然后恢复的时候再依次把后继节点除以该数a[i]。最后每次输出c[Q]。

我的代码可以通过样例,但是提交上去全部WA。十分不解,求大神解答,万分感谢。

#include<iostream>
using namespace std;
#define lowbit(x) ((-x)&x)
const __int128 MAXQ=100005;
long long Q,M,inpo,inpx,outp;
__int128 c[MAXQ];
long long a[MAXQ];
void update(__int128 x,__int128 val)
{
	while(x<=Q)
	{
		c[x]*=val;
		x=x+lowbit(x);
	}
}
void undo(__int128 x)
{
	__int128 t=a[x];
	while(x<=Q)
	{
		c[x]/=t;
		x=x+lowbit(x);
	}
}
__int128 sum(__int128 x)
{
	__int128 res=1;
	while(x>0)
	{
		res*=c[x];
		x=x-lowbit(x);
	}
	return res;
}
int main()
{
	long long tt;
	cin>>tt;
	for(__int128 ti=0;ti<tt;ti++)
	{
		cin>>Q>>M;
		for(__int128 i=0;i<=Q;i++)
		{
			a[i]=1;
		}
		for(__int128 i=0;i<=Q;i++)
		{
			c[i]=1;
		}
		for(__int128 i=1;i<=Q;i++)
		{
			cin>>inpo;
			if(inpo==1)
			{
				cin>>a[i];
				update(i,a[i]);
			}
			if(inpo==2)
			{
				cin>>inpx;
				undo(inpx);
			}
			outp=sum(Q)%M;
			cout<<outp<<endl;
		}
	}
	return 0;
}
2021/10/2 21:18
加载中...