考虑分块,但是求调
  • 板块P4135 作诗
  • 楼主diqiuyi奶龙
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/14 21:45
  • 上次更新2024/1/15 12:57:52
查看原帖
考虑分块,但是求调
324666
diqiuyi奶龙楼主2024/1/14 21:45

rt,全 WA

#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define uint unsigned int
#define pii pair<int,int>
using namespace std;
inline int read(){
	int x=0;bool f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=0;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return f?x:-x;
}
int n,m,c,now,lst,l,r,block,a[100005],bl[100005],pre[100005][380],ans[380][380],t[800],cnt[100005];
int main(){
	n=read(),c=read(),m=read(),block=sqrt(n);
	for(int i=1;i<=n;i++)
		a[i]=read(),bl[i]=(i-1)/block+1;
	for(int i=1;i<=bl[n];i++){
		for(int j=i;j<=bl[n];j++){
			for(int k=(j-1)*block+1;k<=min(n,j*block);k++)
				if(++cnt[a[k]]&1){
					if(cnt[a[k]]>2)
						now--;
				}
				else now++;
			ans[i][j]=now;
//			printf("%d %d %d\n",i,j,ans[i][j]);
		}
		memset(cnt,0,sizeof(cnt));
		now=0;
	}
	for(int i=1;i<=bl[n];i++){
		for(int j=(i-1)*block+1;j<=min(i*block,n);j++)
			cnt[a[j]]++;
		for(int j=1;j<=c;j++)
			pre[j][i]=cnt[j];
	}
	memset(cnt,0,sizeof(cnt));
	while(m--){
		l=read(),r=read();
		l=(l+lst)%n+1,r=(r+lst)%n+1;
		if(l>r) swap(l,r);
//		printf("%d %d\n",l,r);
		lst=0;
		if(bl[r]-bl[l]<2){
			for(int i=l;i<=r;i++){
				t[++t[0]]=a[i],cnt[a[i]]++;
				if(cnt[a[i]]&1){
					if(cnt[a[i]]>2)
						lst--;
				}
				else lst++;
			}
			printf("%d\n",lst);
		}
		else{
			lst=ans[bl[l]+1][bl[r]-1];
			for(int i=l;i<=bl[l]*block;i++){
				if(!cnt[a[i]])
					t[++t[0]]=a[i];
				cnt[a[i]]++;
			}
			for(int i=(bl[r]-1)*block+1;i<=r;i++){
				if(!cnt[a[i]])
					t[++t[0]]=a[i];
				cnt[a[i]]++;
			}
			for(int i=1;i<=t[0];i++)
				if(cnt[t[i]]&1)
					if(pre[t[i]][bl[r]-1]-pre[t[i]][bl[l]]&1) lst++;
					else lst--;
				else if(!(pre[t[i]][bl[r]-1]-pre[t[i]][bl[l]])) lst++;
			printf("%d\n",lst);
		}
		for(int i=1;i<=t[0];i++)
			cnt[t[i]]=0;
		t[0]=0;
	}
    return 0;
}
2024/1/14 21:45
加载中...