这样复杂度是对的吗?
查看原帖
这样复杂度是对的吗?
264463
添哥楼主2023/6/28 11:46
#include<iostream>
using namespace std;
long long a[300005],tree[1200005];
bool ok[1200005];
int d[1000005];
inline void pushup(int i)
{
	tree[i]=tree[i<<1]+tree[i<<1|1];
	if(ok[i<<1]&&ok[i<<1|1])
	{
		ok[i]=true;
	}
	else
	{
		ok[i]=false;
	}
}
void build(int l,int r,int i)
{
	if(l==r)
	{
		tree[i]=a[l];
		if(a[l]==1||a[l]==2)
		{
			ok[i]=true;
		}
		else
		{
			ok[i]=false;
		}
	}
	else
	{
		int mid=(l+r)>>1;
		build(l,mid,i<<1);
		build(mid+1,r,i<<1|1);
		pushup(i);
	}
}
void modify(int l,int r,int ql,int qr,int i)
{
	if(qr<l||r<ql||ok[i])
	{
		return;
	}
	if(l==r)
	{
		tree[i]=d[tree[i]];
		if(tree[i]==1||tree[i]==2)
		{
			ok[i]=true;
		}
		else
		{
			ok[i]=false;
		}
		return;
	}
	int mid=(l+r)>>1;
	modify(l,mid,ql,qr,i<<1);
	modify(mid+1,r,ql,qr,i<<1|1);
	pushup(i);
}
long long ask(int l,int r,int ql,int qr,int i)
{
	if(qr<l||r<ql)
	{
		return 0;
	}
	if(ql<=l&&r<=qr)
	{
		return tree[i];
	}
	int mid=(l+r)>>1;
	return ask(l,mid,ql,qr,i<<1)+ask(mid+1,r,ql,qr,i<<1|1);
}
int main()
{
	for(int i=1;i<=1000000;i++)
	{
		for(int j=i;j<=1000000;j+=i)
		{
			d[j]++;
		}
	}
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,n,1);
	while(m--)
	{
		int opt,l,r;
		cin>>opt>>l>>r;
		if(opt==1)
		{
			modify(1,n,l,r,1);
		}
		else
		{
			cout<<ask(1,n,l,r,1)<<endl;
		}
	}
	return 0;
}

TLE on #67

是复杂度错了还是常数太大被卡了?

2023/6/28 11:46
加载中...