求助!!!
  • 板块P4135 作诗
  • 楼主zhangjiting
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/22 17:31
  • 上次更新2023/11/22 19:58:20
查看原帖
求助!!!
754311
zhangjiting楼主2023/11/22 17:31

下载了测试点 1,本地测是对的,交上去第一个点就是 WA。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=405;
int block,tot,lt[M],rt[M],belong[N];
int sum[M][N],ans[M][M],mp[N];
int n,m,c,a[N];
void build(){
	block=sqrt(n)+1;
	tot=n/block;
	if(n%block) tot++;
	for(int i=1;i<=tot;i++){
		lt[i]=(i-1)*block+1;
		rt[i]=i*block;
	}
	rt[tot]=n;
	for(int i=1;i<=n;i++){
		belong[i]=(i-1)/block+1;
		sum[belong[i]][a[i]]++;
	}
	for(int i=1;i<=100000;i++){
		for(int j=1;j<=tot;j++){
			sum[j][i]+=sum[j-1][i];
		}
	}
	for(int i=1;i<=tot;i++){
		int now=0;
		for(int j=lt[i];j<=n;j++){
			mp[a[j]]++;
			if(mp[a[j]]%2==0) now++;
			else if(mp[a[j]]>2) now--;
			ans[i][belong[j]]=now;
		}
		for(int j=lt[i];j<=n;j++)mp[a[j]]--;
	}
}
int ask(int x,int y){
	int now=0;
	int l=belong[x],r=belong[y];
	if(l==r){
		for(int i=x;i<=y;i++){
			mp[a[i]]++;
			if(mp[a[i]]%2==0) now++;
			else if(mp[a[i]]>2) now--;
		}
		for(int i=x;i<=y;i++) mp[a[i]]--;
		return now;
	}
	now=ans[l+1][r-1];
	for(int i=x;i<=rt[belong[x]];i++){
		mp[a[i]]++;
        if((mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]])%2==0) now++;
        else if(mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]]>2) now--;
	}
	for(int i=lt[belong[y]];i<=y;i++){
		mp[a[i]]++;
        if((mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]])%2==0) now++;
        else if(mp[a[i]]+sum[r-1][a[i]]-sum[l][a[i]]>2) now--;
	}
	for(int i=x;i<=rt[belong[x]];i++)mp[a[i]]--;
	for(int i=lt[belong[y]];i<=y;i++)mp[a[i]]--;
	return now;
}
signed main(){
//	freopen("P4135_1.in","r",stdin);
//	freopen("test.out","w",stdout);
	cin>>n>>c>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build();
	for(int i=1,l,r,last_ans;i<=m;i++){
		cin>>l>>r;
		int L=(l+last_ans)%n+1,R=(r+last_ans)%n+1;
		if(L>R) swap(L,R);
		last_ans=ask(L,R);
		cout<<last_ans<<endl;
	}
	return 0;
}
2023/11/22 17:31
加载中...