[洛谷P3396]哈希冲突

题目大意:有$n$个数,两个操作

  1. $A\;p\;x:$询问当把第$i$个数放在第$i\bmod p$个桶中时,第$x$个桶内数的和
  2. $C\;x\;y:$把第$x$个数改为$y$

题解:把每个$p\leqslant \sqrt n$的答案预处理出来,复杂度$O(n\sqrt n)$。对于$p>\sqrt n$的询问怎么办呢?暴力算,复杂度是$O(n\dfrac{n}{p})$,因为$p>\sqrt n$,所以$\dfrac n p <\sqrt n$,复杂度为$O(n\sqrt n)$。修改也是暴力修改,复杂度为$O(\sqrt n)$

卡点:



C++ Code:

#include <cstdio>
#define maxn 150010
#define sqn 388
int n, m;
int s[maxn];
int V[400][400];
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", s + i);
		for (int j = 1; j < sqn; j++) V[j][i % j] += s[i];
	}
	while (m --> 0) {
		char op[10];
		int x, y;
		scanf("%s%d%d", op, &x, &y);
		if (*op == 'A') {
			int ans = 0;
			if (x < sqn) ans = V[x][y];
			else for (int i = y; i <= n; i += x) ans += s[i];
			printf("%d\n", ans);
		} else {
			int tmp = y - s[x]; s[x] = y;
			for (int i = 1; i < sqn; i++) V[i][x % i] += tmp;
		}
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/Memory-of-winter/p/9577903.html