[洛谷P3396]哈希冲突
题目大意:有$n$个数,两个操作
- $A\;p\;x:$询问当把第$i$个数放在第$i\bmod p$个桶中时,第$x$个桶内数的和
- $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;
}

浙公网安备 33010602011771号