首页 > 其他 > 详细

洛谷P3396 哈希冲突

时间:2018-12-27 21:58:16      阅读:160      评论:0      收藏:0      [点我收藏+]

分块还真是应用广泛啊......

题意:求技术分享图片

解:以n0.5为界。

当p小于n0.5的时候,直接用p2大小的数组储存答案。

预处理n1.5,修改n0.5

当p大于n0.5的时候,直接按照定义计算,复杂度n0.5

所以总复杂度n1.5,实在是巧妙不堪啊......(什么SB词汇)

技术分享图片
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cmath>
 4 
 5 const int N = 150010;
 6 
 7 int fr[N], le[N], re[N];
 8 int ans[400][400], a[N];
 9 char str[3];
10 
11 int main() {
12     int n, m;
13     scanf("%d%d", &n, &m);
14     int T = sqrt(n);
15     for(int i = 1; i <= n; i++) {
16         scanf("%d", &a[i]);
17         fr[i] = (i - 1) / T + 1;
18     }
19     for(int i = 1; i <= fr[n]; i++) {
20         le[i] = re[i - 1] + 1;
21         re[i] = le[i] + T - 1;
22         if(i == fr[n]) {
23             re[i] = n;
24         }
25     }
26     for(int i = 1; i <= T; i++) {
27         for(int j = 1; j <= n; j++) {
28             ans[i][j % i] += a[j];
29         }
30     }
31 
32     for(int i = 1, x, y; i <= m; i++) {
33         scanf("%s%d%d", str, &x, &y);
34         if(str[0] == A) { // ask
35             if(x <= T) {
36                 printf("%d\n", ans[x][y]);
37             }
38             else {
39                 int ans = 0;
40                 for(int k = 0; k * x + y <= n; k++) {
41                     ans += a[k * x + y];
42                 }
43                 printf("%d\n", ans);
44             }
45         }
46         else { // change
47             for(int j = 1; j <= T; j++) {
48                 ans[j][x % j] += y - a[x];
49             }
50             a[x] = y;
51         }
52     }
53 
54     return 0;
55 }
AC代码

 

洛谷P3396 哈希冲突

原文:https://www.cnblogs.com/huyufeifei/p/10187465.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!