疑问 If you 20pts
  • 板块P4135 作诗
  • 楼主cshur
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/6/29 14:45
  • 上次更新2025/6/30 12:19:02
查看原帖
疑问 If you 20pts
1372132
cshur楼主2025/6/29 14:45
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5+5;
const int M = sqrt(N);

int n,q;
int a[N]; 

int Id[N],siz;
pair<int,int> group[M];
int p = 0;

int sum[M][N];
int maxn[M][M];
int cnt[N];

bool vis[N];
int query(int l,int r)
{
	if(Id[l]+1 >= Id[r])
	{
		for(int i = l; i <= r; i++)
			cnt[a[i]]++;
		int ans = 0;
		for(int i = l; i <= r; i++)
			if(cnt[a[i]] % 2 == 0 && !vis[a[i]])
				ans++,vis[a[i]] = 1;
		for(int i = l; i <= r; i++)
			cnt[a[i]] = 0,vis[a[i]] = 0;
		return ans;
	}
	else
	{
		int ans = maxn[Id[l]+1][Id[r]-1];
		for(int i = l; i <= group[Id[l]].second; i++)
			cnt[a[i]]++;
		for(int i = group[Id[r]].first; i <= r; i++)
			cnt[a[i]]++;
		for(int i = l; i <= group[Id[l]].second; i++)
			if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 0 && (cnt[a[i]] % 2 == 1 || (sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) == 0) && !vis[a[i]])
				ans++,vis[a[i]] = 1;
			else if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 1 && (cnt[a[i]] % 2 == 1) && ((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) != 0) && !vis[a[i]])
				ans--,vis[a[i]] = 1;
		for(int i = group[Id[r]].first; i <= r; i++)
			if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 0 && (cnt[a[i]] % 2 == 1 || (sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) == 0) && !vis[a[i]])
				ans++,vis[a[i]] = 1;
			else if((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]+cnt[a[i]]) % 2 == 1 && (cnt[a[i]] % 2 == 1) && ((sum[Id[r]-1][a[i]]-sum[Id[l]][a[i]]) != 0) && !vis[a[i]])
				ans--,vis[a[i]] = 1;
		for(int i = l; i <= group[Id[l]].second; i++)
			cnt[a[i]] = 0,vis[a[i]] = 0;
		for(int i = group[Id[r]].first; i <= r; i++)
			cnt[a[i]] = 0,vis[a[i]] = 0;
		return ans;
	}
}

int main()
{
//	freopen("Test.in","r",stdin);
//	freopen("Test.txt","w",stdout);
	int c;
	cin >> n >> c >> q;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	
//	vector<int> v;
//	for(int i = 1; i <= n; i++)
//		v.push_back(a[i]);
//	sort(v.begin(),v.end());
//	v.erase(unique(v.begin(),v.end()),v.end());
//	for(int i = 1; i <= n; i++)
//		a[i] = lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
	
	siz = sqrt(n);
	for(int i = 1; i <= n; i++)
		Id[i] = (i-1)/siz+1;
	for(int i = 1; i <= n; i++)
		if(Id[i] != Id[i-1])
			group[++p].first = i,
			group[p-1].second = i-1;
	group[p].second = n;
	
	for(int i = 1; i <= n; i++)
		sum[Id[i]][a[i]]++;
	for(int i = 1; i <= p; i++)
		for(int j = 1; j <= c; j++)
			sum[i][j] = sum[i-1][j]+sum[i][j];
	for(int i = 1; i <= p; i++)
	{
		memset(cnt,0,sizeof(cnt));
		memset(vis,0,sizeof(vis));
		for(int j = i; j <= p; j++)
		{
			maxn[i][j] = maxn[i][j-1];
			for(int k = group[j].first; k <= group[j].second; k++)
				cnt[a[k]]++;
			for(int k = group[j].first; k <= group[j].second; k++)
				if(cnt[a[k]] % 2 == 0 && !vis[a[k]])
					maxn[i][j]++,vis[a[k]] = 1;
				else if(cnt[a[k]] % 2 == 1 && vis[a[k]])
					maxn[i][j]--,vis[a[k]] = 0;
		}
	}
	memset(cnt,0,sizeof(cnt));
	memset(vis,0,sizeof(vis));
	
	int x = 0,l,r;
	while(q--)
	{
		cin >> l >> r;
		l = (l+x) % n + 1;
		r = (r+x) % n + 1;
		if(l > r) swap(l,r);
		x = query(l,r);
		cout << x << endl;
	}
	return 0;
}
//fc Test.out Test.txt
/*
Hack:
#1: 
6 3 4
3 1 2 2 2 2 
4 6
1 3
6 6
1 3
-------
0
1
0
1
*/

为什么空间开 1e520pts,开 2e5 过了
2025/6/29 14:45
加载中...