新人求助,分块代码谜之耗时
  • 板块P4135 作诗
  • 楼主wzxx
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/5/11 15:59
  • 上次更新2023/11/7 02:39:31
查看原帖
新人求助,分块代码谜之耗时
42758
wzxx楼主2020/5/11 15:59

有没有大佬看一下蒟蒻的垃圾代码

不知道慢在哪里

不开O2二三十分

开了O2总耗时也要10s+

本机测也没有太慢啊

但一交上去就T飞

为什么我的分块这么慢(可怜

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
	using namespace std;
	int n=0,c=0,m=0;
	int a[100005];
	int L[320],R[320],Blk[100005]; 
	int s[320][320],tot[320][100005];
	int cnt[100005];
inline int rd()
{
	int x=0;
	char ch=' ';
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9')
		x=(x<<3)+(x<<1)+ch-48,ch=getchar();
	return x; 
}
inline int GetSum(int Col,int l,int r)
	{return tot[l][Col]-tot[r+1][Col];}
inline int Calc(int x)
	{return !(x&1)?1:((x>1)?-1:0);}
inline int Qry(int l,int r)
{
	int ans=0;
	if(Blk[r]-Blk[l]<=1)
	{
		for(int i=l;i<=r;++i) ans+=Calc(++cnt[a[i]]);
		for(int i=l;i<=r;++i) cnt[a[i]]=0;
		return ans;
	}
	ans=s[Blk[l]+1][Blk[r]-1];
	for(register int i=l;i<=R[Blk[l]];++i) cnt[a[i]]=GetSum(a[i],Blk[l]+1,Blk[r]-1);
	for(register int i=L[Blk[r]];i<=r;++i) cnt[a[i]]=GetSum(a[i],Blk[l]+1,Blk[r]-1);
	for(register int i=l;i<=R[Blk[l]];++i) ans+=Calc(++cnt[a[i]]);
	for(register int i=L[Blk[r]];i<=r;++i) ans+=Calc(++cnt[a[i]]);
	for(register int i=l;i<=R[Blk[l]];++i) cnt[a[i]]=0;
	for(register int i=L[Blk[r]];i<=r;++i) cnt[a[i]]=0;
	return ans;
}
int main()
{
	n=rd(),c=rd(),m=rd();
	for(int i=1;i<=n;++i) a[i]=rd();
	int nBlk=sqrt(n);
	for(int i=1;i<=nBlk;++i)
	{
		L[i]=R[i-1]+1;
		R[i]=L[i]+nBlk-1;
	}
	if(R[nBlk]<n)
	{
		nBlk++;
		L[nBlk]=R[nBlk-1]+1;
		R[nBlk]=n; 
	}
	for(int i=1;i<=nBlk;++i)
		for(int j=L[i];j<=R[i];++j)	Blk[j]=i;
	for(int i=1;i<=nBlk;++i)
	{
		int ans=0;
		for(int j=L[i];j<=n;++j)
		{
			ans+=Calc(++tot[i][a[j]]);
			if(j==R[Blk[j]]) s[i][Blk[j]]=ans;
		}
	}
	int lans=0;
	for(int i=1;i<=m;++i)
	{
		int x=rd(),y=rd();
		x=(x+lans)%n+1;
		y=(y+lans)%n+1;
		if(x>y) swap(x,y);
		lans=Qry(x,y);
		printf("%d\n",lans);
	}
	return 0;
}
2020/5/11 15:59
加载中...