求改进
查看原帖
求改进
242524
JRzyh楼主2020/10/24 17:45

再交几次估计我也进陶片了

#include<bits/stdc++.h> 
using namespace std;
char ibuf[900<<20],*re,out[900<<20];
int wz;
inline int read()
{
    register int u=0;
    while(*re<48) re++;
    while(*re>32)
        u=u*10+*re++-48;
    return u;
}
void print(long long x)
{
    if(x>9) print(x/10);
    out[wz++]=x%10+'0';
}
#define lowbit(x) (x&(-x))
long long tree[500001];
int n;
inline long long get_sum(int wh)
{
	register long long ans=0;
	for(;wh;wh^=lowbit(wh)) ans+=tree[wh];
	return ans;
}
inline void add(int wh,long long v)
{
	for(;wh<=n;wh+=lowbit(wh)) tree[wh]+=v;
}
vector<int>fa[500008],ys[500008];
int find(int x,int i)
{
	if(i==fa[x].size()||fa[x][i]==i)return i;
	else return fa[x][i]=find(x,fa[x][i]);
}
int a[100008],m,nmp;
long long la;
int main()
{
	fread(re=ibuf,1,900<<20,stdin);
	n=read();m=read();
	for(register int i=1;i<=n;i++)
	{
		add(i,a[i]=read());
		nmp=max(nmp,a[i]);
		for(register int j=1;j*j<=a[i];j++)
		{
			if(!(a[i]%j))
			{
				ys[j].push_back(i);
				if(a[i]!=j*j)ys[a[i]/j].push_back(i);
			}
		}
	}
	for(int i=2;i<=nmp;i++)
	{
		fa[i].resize(ys[i].size());
		for(int j=0;j<ys[i].size();j++)fa[i][j]=j;
	}
	while(m--)
	{
		short opt=read();
		switch(opt)
		{
			case 1:
			{
				int l=read()^la,r=read()^la,x=read()^la;
				if(ys[x].empty()||x==1)continue;
				for(register int l1=find(x,lower_bound(ys[x].begin(),ys[x].end(),l)-ys[x].begin());l1<ys[x].size()&&ys[x][l1]<=r;l1=find(x,l1+1))
				{
					if(!(a[ys[x][l1]]%x))
					{
						add(ys[x][l1],-a[ys[x][l1]]+a[ys[x][l1]]/x);
						a[ys[x][l1]]/=x;
					}
					if(a[ys[x][l1]]%x)fa[x][l1]=l1+1;
				}
				break;
			}
			case 2:
			{
				int l=read()^la,r=read()^la;
				la=get_sum(r)-get_sum(l-1);
				print(la),out[wz++]='\n';
				break;
			}
		}
	}
	fwrite(out,1,wz,stdout);
	return 0;
}

我分析了一下command_block的代码,他把vector改成了int*,但是没看出来int*如何初始化的内存qwq

2020/10/24 17:45
加载中...