求助分块为什么WA了
查看原帖
求助分块为什么WA了
460429
Andy_L楼主2023/8/24 21:20
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int maxn=2e5+100;
const int mod=998244353;

inline int read()
{
    int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
	return x*f;
}

int num,len;
int a[maxn];
int block[maxn];
int lenn[maxn];
int st[maxn],ed[maxn];
int sum[maxn];
bool flag[maxn];
bool flag2[maxn];

void init(int n)
{
	len=sqrt(n);
	num=n%len?n/len+1:n/len;
	for (int i=1;i<=num;i++)
	{
		st[i]=(i-1)*len+1;
		ed[i]=i*len;
		lenn[i]=ed[i]-st[i]+1;
	}
	for (int i=1;i<=n;i++) for (int j=st[i];j<=ed[i];j++) block[j]=i;
}

signed main()
{
	int n=read(),m=read();
	init(n);
	for (int i=1;i<=n;i++)
	{
		a[i]=read();
		sum[block[i]]+=a[i]; 
	}
	while (m--)
	{
		int opt=read();
		int l=read(),r=read();
		if(l>r) swap(l,r);
		if(opt==1)
		{
			if(block[l]==block[r])
			{
				if(!flag[block[l]])
				{
					for (int i=l;i<=r;i++)
					{
						sum[block[i]]-=a[i];
						a[i]=sqrt(a[i]);
						sum[block[i]]+=a[i];
					}
					if(sum[block[l]]==lenn[block[l]]) flag[block[l]]=1;
				}
			}
			else
			{
				if(!flag[block[l]])
				{
					for (int i=l;i<=ed[block[l]];i++)
					{
						sum[block[i]]-=a[i];
						a[i]=sqrt(a[i]);
						sum[block[i]]+=a[i];
					}
					if(sum[block[l]]==lenn[block[l]]) flag[block[l]]=1;
				}
				for (int i=block[l]+1;i<block[r];i++)
				{
					if(!flag[i])
					{
						for (int j=st[i];j<=ed[i];j++)
						{
							sum[i]-=a[j];
							a[j]=sqrt(a[j]);
							sum[i]+=a[j];
						}
						if(sum[i]==lenn[i]) flag[i]=1;
					}
				}
				if(!flag[block[r]])
				{
					for (int i=st[block[r]];i<=r;i++)
					{
						sum[block[i]]-=a[i];
						a[i]=sqrt(a[i]);
						sum[block[i]]+=a[i];
					}
					if(sum[block[r]]==lenn[block[r]]) flag[block[r]]=1;
				}
			}
		}
		else
		{
			if(block[l]==block[r])
			{
				if(!flag2[block[l]])
				{
					for (int i=l;i<=r;i++)
					{
						sum[block[i]]-=a[i];
						a[i]=a[i]*a[i];
						sum[block[i]]+=a[i];
					}
					if(sum[block[l]]==lenn[block[l]]) flag2[block[l]]=1;
				}
			}
			else
			{
				if(!flag2[block[l]])
				{
					for (int i=l;i<=ed[block[l]];i++)
					{
						sum[block[i]]-=a[i];
						a[i]=a[i]*a[i];
						sum[block[i]]+=a[i];
					}
					if(sum[block[l]]==lenn[block[l]]||sum[block[l]]==0) flag2[block[l]]=1;
				}
				for (int i=block[l]+1;i<block[r];i++)
				{
					if(!flag2[i])
					{
						for (int j=st[i];j<=ed[i];j++)
						{
							sum[i]-=a[j];
							a[j]=a[j]*a[j];
							sum[i]+=a[j];
						}
						if(sum[i]==lenn[i]||sum[i]==0) flag2[i]=1;
					}
				}
				if(!flag2[block[r]])
				{
					for (int i=st[block[r]];i<=r;i++)
					{
						sum[block[i]]-=a[i];
						a[i]=a[i]*a[i];
						sum[block[i]]+=a[i];
					}
					if(sum[block[r]]==lenn[block[r]]||sum[block[r]]==0) flag2[block[r]]=1;
				}
			}
		}
	}
	int ans=0;
	for (int i=1;i<=n;i++) ans+=a[i],ans=(ans+mod)%mod;
	printf("%lld\n",(ans+mod)%mod);
	return 0;
}
2023/8/24 21:20
加载中...