树状数组+高精度修改,在线等,挺急的
  • 板块学术版
  • 楼主FarmarJohn
  • 当前回复11
  • 已保存回复13
  • 发布时间2023/11/14 16:12
  • 上次更新2023/11/14 18:05:04
查看原帖
树状数组+高精度修改,在线等,挺急的
750365
FarmarJohn楼主2023/11/14 16:12

rt

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,a[500010][4010],cmd=1,x,y,z,tmp,c[4010],b[4010],ii[500010],cc;
inline void read(register int &a)
{
    a=0;char c;
    while((c=getchar())<48);
    do a=(a<<3)+(a<<1)+(c^48);
    while((c=getchar())>47);
}
inline void write(register long long x)
{
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x|48);
	else write(x/10),putchar(x%10|48);
}
inline int lowbit(int x)
{
	return x&-x;
}
int main(void)
{
	read(n),read(m);
	for(int k=1;k<=n;++k)
	{
		string s;
		cin >> s; 
		cmd=k;
		for(int j=0;j<s.size();++j)
		{
			b[j]=s[s.size()-1-j]-'0';
		}
		while(cmd<=n)
		{
			int len1=ii[cmd],len2=s.size(),len3=max(len2,len1),t=0;
			for(int i=0;i<len3;i++)
			{
				a[cmd][i]=a[cmd][i]+b[i]+t;
				if(a[cmd][i]>=10)
				{
					t=1;
					a[cmd][i]%=10;
				}
				else t=0;
			}
			if(t==1)
			{
				++len3;
				a[cmd][len3-1]=1; 
			}
			cmd+=lowbit(cmd);
			ii[cmd]=len3;
		}
	}
	for(int mm=1;mm<=m;++mm)
	{
		read(x);
		if(x==1)
		{
			read(y);
			string z;
			cin >> z;
			for(int j=0;j<z.size();++j)
			{
				b[j]=z[z.size()-1-j]-'0';
			}
			cmd=y;
			while(cmd<=n)
			{
				int len1=ii[cmd],len2=z.size(),len3=max(len2,len1),t=0;
				for(int i=0;i<len3;++i)
				{
					a[cmd][i]=a[cmd][i]+b[i]+t;
					if(a[cmd][i]>=10)
					{
						t=1;
						a[cmd][i]%=10;
					}
					else t=0;
				}
				if(t==1)
				{
					++len3;
					a[cmd][len3-1]=1; 
				}
				cmd+=lowbit(cmd);
				ii[cmd]=len3;
			}
		}
		else
		{
			read(y),read(z);
			//z:
			cmd=z;
			for(int i=0;i<ii[z];++i)c[i]=a[cmd][i];
			cc=ii[z];
			while(cmd>=1)
			{
				int len2=ii[z],len3=max(len2,cc),t=0;
				for(int i=0;i<len3;++i)
				{
					c[i]+=a[cmd-lowbit(cmd)][i]+t;
					if(c[i]>=10)
					{
						t=1;
						c[i]%=10;
					}
					else t=0;
				}
				if(t==1)
				{
					++len3;
					c[len3-1]=1; 
				}
				cc=len3;
				cmd-=lowbit(cmd);
			}
			//a
			--y;
			cmd=y;
			int lb=ii[cmd],lc=max(cc,lb);
			int tmp[cc+1];
			for(int i=0;i<cc;++i)tmp[i]=c[i];
			for(int i=0;i<lc;++i)
			{
				if(tmp[i]<a[cmd][i])
				{
					tmp[i+1]--;
					tmp[i]+=10;
				}
				c[i]=tmp[i]-a[cmd][i];
			}
			while(cmd>=1)
			{
				for(int i=0;i<cc;++i)tmp[i]=c[i];
				int lb=ii[cmd-lowbit(cmd)];
				int lc=max(cc,lb);
				for(int i=0;i<lc;++i)
				{
					if(tmp[i]<a[cmd][i])
					{
						tmp[i+1]--;
						tmp[i]+=10;
					}
					c[i]=tmp[i]-a[cmd][i];
				}
				while(c[lc]==0&&lc>0)--lc;
				cmd-=lowbit(cmd);
			}
			for(int i=ii[cmd]-1;i>=0;--i)cout << c[i];
			putchar('\n');
		}
	}
	return 0;
}
2023/11/14 16:12
加载中...