博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4267 A Simple Problem with Integers
阅读量:6037 次
发布时间:2019-06-20

本文共 1192 字,大约阅读时间需要 3 分钟。

HDU_4267

    根据k的值建立10类树状数组,每类中根据i%k的不同建立k棵树状数组,也就是55棵树状数组,这样每次修改操作只对其中1棵树状数组进行操作,所以是O(logN)的复杂度,每次查询只对其中10棵树状数组统计增量和,所以是O(10*logN)的复杂度。

#include
#include
#define MAXD 50010int N, M, d[100][MAXD], a[MAXD];void insert(int k, int x, int v){ for(; x <= N; x += x & -x) d[k][x] += v;}void init(){ int i, j; for(i = 1; i <= N; i ++) scanf("%d", &a[i]); for(i = 0; i < 100; i ++) memset(d[i], 0, sizeof(d[i][0]) * (N + 1));}int query(int id){ int i, k, x, ans = 0; for(i = 1; i <= 10; i ++) { k = (i - 1) * 10 + id % i; for(x = id; x > 0; x -= x & -x) ans += d[k][x]; } return a[id] + ans;}void solve(){ int i, op, a, b, k, c; scanf("%d", &M); for(i = 0; i < M; i ++) { scanf("%d", &op); if(op == 1) { scanf("%d%d%d%d", &a, &b, &k, &c); b -= (b - a) % k; insert(10 * (k - 1) + a % k, a, c); if(b < N) insert(10 * (k - 1) + b % k, b + 1, -c); } else if(op == 2) { scanf("%d", &a); printf("%d\n", query(a)); } }}int main(){ while(scanf("%d", &N) == 1) { init(); solve(); } return 0;}

转载地址:http://lurhx.baihongyu.com/

你可能感兴趣的文章
svmlight使用说明
查看>>
Swing 和AWT之间的关系
查看>>
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
获取post传输参数
查看>>
ASP生成静态页面的方法
查看>>
HDU 1325 Is It A Tree? 判断是否为一棵树
查看>>
Shell命令-文件压缩解压缩之gzip、zip
查看>>
个人总结
查看>>
uva 673 Parentheses Balance
查看>>
Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
查看>>
css 禁止选中文本
查看>>
bzoj2165
查看>>
算术运算表达式正则及分析
查看>>
Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb
查看>>
shell初涉
查看>>
[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(二)
查看>>
windows添加和删除服务
查看>>
关于云栖,有点无语的几个地方,管理能不能管?
查看>>
Windows线程的同步与互斥
查看>>