分块,WA,求调
查看原帖
分块,WA,求调
501947
DengDuck鄧德楼主2024/1/14 20:14
#include <stdio.h>
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL N=1e5+5;
template <typename T> void Rd(T &x)
{
	int fu=1;
	x=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') fu=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch-48);
	x*=fu;
}
LL n,m, op, x, y,tag[N],b[N],L[N],R[N],tot;
LL a[N],s[N];
int main() 
{
	while(~scanf("%lld",&n))
	{
		printf("Case #%lld:\n",++tot);
		LL B=sqrt(n);
		for (register int i = 1; i <= n; i++) 
		{
			Rd(a[i]);
		}
		for(register int i=1;R[i-1]+1<=n;i++)
		{
			tag[i]=s[i]=0;
			L[i]=R[i-1]+1,R[i]=min(B*i,n);
			for(int j=L[i];j<=R[i];j++)b[j]=i,s[i]+=a[j];
		}
		Rd(m);
		while(m--)
		{
			Rd(op),Rd(x),Rd(y);
			if(x>y)swap(x,y);
			if (op) 
			{
				LL sum=0;
				LL bx=b[x],by=b[y];
				if(bx==by)
				{
					if(tag[bx])puts("0");
					else
					{
						for(register int i=x;i<=y;i++)sum+=a[i];
						printf("%lld\n",sum);	
					}
					continue;
				}
				for(register int i=x;i<=R[bx];i++)sum+=a[i];
				for(register int i=L[by];i<=y;i++)sum+=a[i];
				bx++,by--;
				for(register int i=bx;i<=by;i++)sum+=s[i];
				printf("%lld\n",sum);
			} 
			else
			{
				LL bx=b[x],by=b[y];
				if(bx==by)
				{
					if(tag[bx])continue;
					for(register int i=x;i<=y;i++)
					{
						s[bx]-=a[i];
						a[i]=sqrt(a[i]);
						s[bx]+=a[i];	
					}
					tag[bx]=1;
					for(register int j=L[bx];j<=R[bx];j++)
					{
						if(a[j]>1)tag[bx]=0;
					}
					continue;
				}
				if(!tag[bx])
				{
					for(register int i=x;i<=R[bx];i++)
					{
						s[bx]-=a[i];
						a[i]=sqrt(a[i]);
						s[bx]+=a[i];
					}
					tag[bx]=1;
					for(register int j=L[bx];j<=R[bx];j++)
					{
						if(a[j]>1)tag[bx]=0;
					}
				}
				if(!tag[by])
				{
					for(register int i=L[by];i<=y;i++)
					{
						s[by]-=a[i];
						a[i]=sqrt(a[i]);
						s[by]+=a[i];
					}	
					tag[by]=1;
					for(register int j=L[by];j<=R[by];j++)
					{
						if(a[j]>1)tag[by]=0;
					}
				}
				
				bx++,by--;
				for(register int i=bx;i<=by;i++)
				{
					if(tag[i])continue;
					tag[i]=1;
					for(register int j=L[i];j<=R[i];j++)
					{
						s[i]-=a[j];
						a[j]=sqrt(a[j]);
						s[i]+=a[j];
						if(a[j]>1)tag[i]=0;
					}
				}
			}
		}	
		printf("\n");
	}
	
}
2024/1/14 20:14
加载中...