全WA求助
  • 板块P4135 作诗
  • 楼主jdzhzw
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/12 11:21
  • 上次更新2024/12/12 18:14:02
查看原帖
全WA求助
1394574
jdzhzw楼主2024/12/12 11:21

这怎么给我干成负数了?

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10, B = 410;
int n, c, m;
int a[N], ans;
int bel[N], blk, tot, L[B], R[B], f[B][B], sum[N];
int num[B][N];
void build()
{
	blk = sqrt(n);
	for (int i = 1; i <= n; i ++) bel[i] = (i - 1) / blk + 1;
	tot = bel[n];
	for (int i = 1; i <= tot; i ++)
	{
		L[i] = R[i - 1] + 1;
		R[i] = blk * i;
	}
	R[tot] = n;
	for (int i = 1; i <= tot; i ++)
	{
		for (int j = i; j <= tot; j ++)
		{
			for (int k = L[j]; k <= R[j]; k ++)
			{
				sum[a[k]] ++;
				if (sum[a[k]] >= 2 && sum[a[k]] % 2 == 0) f[i][j] ++;
				if (sum[a[k]] >= 2 && sum[a[k]] % 2 == 1) f[i][j] --;
			}
		}
		for (int j = 1; j <= c; j ++) num[i][j] = num[i - 1][j];
		for (int j = L[i]; j <= R[i]; j ++) num[i][a[j]] ++;
		for (int j = 1; j <= c; j ++) sum[j] = 0;
	}
}
int solve(int l, int r)
{
	int x = bel[l], y = bel[r], ans = 0;
	if (x == y || x + 1 == y)
	{
		for (int i = l; i <= r; i ++)
		{
			sum[a[i]] ++;
			if (sum[a[i]] >= 2 && sum[a[i]] % 2 == 0) ans ++;
			if (sum[a[i]] >= 2 && sum[a[i]] % 2 == 1) ans --;
		}
		for (int i = l; i <= r; i ++) sum[a[i]] = 0;
		return ans;
	}
	ans = f[x + 1][y - 1];
	for (int i = l; i <= R[x]; i ++) sum[a[i]] ++;
	for (int i = L[y]; i <= r; i ++) sum[a[i]] ++;
	for (int i = l; i <= R[x]; i ++)
	{
		if (sum[a[i]] == 0) continue;
		int k = num[y - 1][a[i]] - num[x][a[i]];
		if (k >= 2 && k % 2 == 0) 
		{
			if (sum[a[i]] % 2 == 1) ans --;
			sum[a[i]] = 0;
			continue;
		}
		k += sum[a[i]];
		if (k >= 2 && k % 2 == 0) ans ++;
		sum[a[i]] = 0;
	}
	for (int i = L[y]; i <= r; i ++)
	{
		if (sum[a[i]] == 0) continue;
		int k = num[y - 1][a[i]] - num[x][a[i]];
		if (k >= 2 && k % 2 == 0) 
		{
			if (sum[a[i]] % 2 == 1) ans --;
			sum[a[i]] = 0;
			continue;
		}
		k += sum[a[i]];
		if (k >= 2 && k % 2 == 0) ans ++;
		sum[a[i]] = 0;
	}
	return ans;
}
signed main()
{
	cin >> n >> c >> m;
	for (int i = 1; i <= n; i ++) scanf("%lld", &a[i]);
	build();
	int l, r;
	for (int i = 1; i <= m; i ++)
	{
		scanf("%lld %lld", &l, &r);
		l = (l + ans) % n + 1;
		r = (r + ans) % n + 1;
		if (l > r) swap(l, r);
		ans = solve(l, r);
		printf("%lld\n", ans);
	}
	return 0;
}

2024/12/12 11:21
加载中...