分块WA求助
查看原帖
分块WA求助
419144
luckydrawbox楼主2021/8/6 20:21
#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const int N=1e5+10,M=500;
int n,m,len;
long long a[N],sum[M];
bool b[M];
ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(ll x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
}
void FK_change(int l,int r)
{
	int sl=l/len,sr=r/len;
	bool f=1;
	if(sl==sr)
	{
		if(b[sl])
			return;
		for(int i=l;i<=r;i++)
			sum[sl]+=sqrt(a[i])-a[i],a[i]=sqrt(a[i]);
		for(int i=sl*len;i<(sl+1)*len&&i<=n;i++)
			if(a[i]>1)
				f=0;
		b[sl]=f;
		return;
	}
	FK_change(l,(sl+1)*len-1);
	FK_change(sr*len,r);
	for(int i=sl+1;i<sr;i++)
	{
		f=1;
		if(b[i])
			continue;
		for(int j=i*len;j<(i+1)*len&&j<=n;j++)
			sum[i]+=sqrt(a[j])-a[j],a[j]=sqrt(a[j]);
		for(int j=i*len;j<(i+1)*len&&j<=n;j++)
			if(a[j]>1)
				f=0;
		b[i]=f;
	}
}
ll FK_q(int l,int r)
{
	ll ans=0;
	int sl=l/len,sr=r/len;
	if(sl==sr)
	{
		for(int i=l;i<=r;i++)
			ans+=a[i];
		return ans;
	}
	ans=FK_q(l,min(n,(sl+1)*len-1))+FK_q(sr*len,r);
	for(int i=sl+1;i<sr;i++)
		ans+=sum[i];
	return ans;
}
int main()
{
	ll T=0;
    while(cin>>n)
    {
    	memset(sum,0,sizeof(sum));
    	memset(b,0,sizeof(b));
    	memset(a,0,sizeof(a));
    	T++;
    	len=sqrt(n);
    	printf("Case #%lld:\n",T);
    	for(int i=1;i<=n;i++)
    		a[i]=read();
    	m=read();
    	for(int i=1;i<=n;i++)
    		sum[i/len]+=a[i];
    	int op,x,y;
    	while(m--)
    	{
    		op=read();
    		x=read();
    		y=read();
    		if(x>y)
    			swap(x,y);
    		if(op)
    			printf("%lld\n",FK_q(x,y));
    		else
    			FK_change(x,y);
		}
		puts("");
	}
	return 0;
}
2021/8/6 20:21
加载中...