WA30pts求条悬棺
  • 板块P4135 作诗
  • 楼主xiaoyang222
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/4 22:20
  • 上次更新2024/12/5 15:55:32
查看原帖
WA30pts求条悬棺
1220111
xiaoyang222楼主2024/12/4 22:20

rt。

#include <iostream>
#include <cmath>
#include <algorithm> 
using namespace std;
const int N=1e5+5,M=350+5;
int n,c,m;
int res[M][M],num[M][N],l[M],r[M],a[N],ans;
int ku[N];
int cnt[N],q,ttq[N],to[N];
int main(){
	freopen("P4135_2.in","r",stdin);
	freopen("P4135_2.ans","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n >> c >> m;q=sqrt(n);
	for (int i=1;i<=n;++i) cin >> a[i];
	int i;
	for (i=1;(i-1)*q+1<=n;++i) l[i]=(i-1)*q+1,r[i]=i*q,ku[r[i]]=i;
	--i;
	r[i]=n;ku[r[i]]=i;
	for (int j=1;j<=i;++j)
		for (int k=l[j];k<=r[j];++k) to[k]=j;
//	cout<<"\n";
//	for (int j=1;j<=i;++j) cout<<l[j]<<" "<<r[j]<<"\n";
//	cout<<"\n";
	for (int j=1;j<=i;++j){
		for (int k=1;k<=c;++k) cnt[k]=0;
		int sm=0;
		for (int k=l[j];k<=n;++k){
			++cnt[a[k]];
			if (cnt[a[k]]%2==0) ++sm;
			if (cnt[a[k]]%2==1 && cnt[a[k]]!=1) --sm;
			if (ku[k]) res[j][ku[k]]=sm;
		}
		for (int k=1;k<=c;++k) num[j][k]=num[j-1][k];
		for (int k=l[j];k<=r[j];++k) ++num[j][a[k]]; 
	} 
	int lt,rt,lid,rid;
	for (int j=1;j<=m;++j){
		cin >> lt >> rt;
		lt=(lt+ans)%n+1,rt=(rt+ans)%n+1;
		if (lt>rt) swap(lt,rt);
		lid=to[lt]+1,rid=to[rt]-1;
//		cout<<lt<<" "<<rt<<" "<<lid<<" "<<rid<<"\n";
		if (rid-lid<=3){
			ans=0;
			for (int k=lt;k<=rt;++k) ++ttq[a[k]];
			for (int k=lt;k<=rt;++k){
				if (ttq[a[k]]){
					if (ttq[a[k]]%2==0) ++ans;
					ttq[a[k]]=0;
				}
			}
			cout<<ans<<"\n";
			continue;
		}
//		cout<<lid<<" "<<rid<<"\n";
		ans=res[lid][rid];
		for (int k=lt;k<=r[lid-1];++k){
			if (ttq[a[k]]==0){
				ttq[a[k]]+=num[rid][a[k]]-num[lid-1][a[k]];
				if (ttq[a[k]]!=0 && ttq[a[k]]%2==0) --ans;//单独不算他
			}
			++ttq[a[k]];
		}
		for (int k=l[rid+1];k<=rt;++k){
			if (ttq[a[k]]==0){
				ttq[a[k]]+=num[rid][a[k]]-num[lid-1][a[k]];
				if (ttq[a[k]]!=0 && ttq[a[k]]%2==0) --ans;
			}
			++ttq[a[k]];
		}
		for (int k=lt;k<=r[lid-1];++k){
			if (ttq[a[k]]){
				if (ttq[a[k]]%2==0) ++ans;
			}
			ttq[a[k]]=0;
		}
		for (int k=l[rid+1];k<=rt;++k){
			if (ttq[a[k]]){
				if (ttq[a[k]]%2==0) ++ans;
			}
			ttq[a[k]]=0;
		}
		cout<<ans<<"\n";
	}
	cout.flush();
	return 0;
} 
2024/12/4 22:20
加载中...