有没有大佬看一下蒟蒻的垃圾代码
不知道慢在哪里
不开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;
}