博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
阅读量:7060 次
发布时间:2019-06-28

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

思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n)

没想到自己以前把这道题当线段树的单点更新刷了。

树状数组:

#include
#include
#include
using namespace std;const int maxn = 5e4 + 10;int tree[maxn], n;void add(int k, int num){ while (k <= n) { tree[k] += num; k += k&-k; }}int sum(int k){ int sum = 0; while (k) { sum += tree[k]; k -= k&-k; } return sum;}int main(){ int t, x, y, k=0; scanf("%d", &t); while (t--) { memset(tree, 0, sizeof(tree)); scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &x); add(i, x); } char num[20]; printf("Case %d:\n", ++k); while (scanf("%s", num), strcmp(num, "End") != 0) { scanf("%d%d", &x, &y); if (strcmp(num,"Add")==0){ add(x, y); } else if (strcmp(num,"Sub")==0){ add(x, -y); } else{ printf("%d\n", sum(y) - sum(x-1)); } } }}

线段树

#include
#include
#include
using namespace std;#define MID(a,b) (a+((b-a)>>1))#define MAXN int(1e4)*5+5struct node{ int l, r; int sum; int mid(){ return MID(l, r); }};int num[MAXN], n;struct Tree{ node tree[MAXN << 2]; void build(int L, int R, int pos) { tree[pos].l = L; tree[pos].r = R; //表示区间 tree[pos].sum = 0; if (L == R){tree[pos].sum = num[R]; return; }//到了子叶 int mid = tree[pos].mid(); //二分 build(L, mid, pos<<1); build(mid + 1, R, pos << 1 | 1); tree[pos].sum = tree[pos << 1].sum + tree[pos << 1 | 1].sum; } //valu 表示加的值, ind 表示第几个军营。(在区域中的位置) void updata(int ind, int pos, int valu) { if (tree[pos].l == tree[pos].r) { tree[pos].sum += valu; return; //叶节点+valu } int mid = tree[pos].mid(); //二分查找单点位置? if (ind <= mid) updata(ind, pos << 1, valu); else updata(ind, pos << 1 | 1, valu); tree[pos].sum = tree[pos << 1].sum + tree[pos << 1 | 1].sum; //递归,覆盖上一层的sum } //查询 int query(int L, int R, int pos)//从根节点查到符合的区间节点 { if (L <= tree[pos].l&&tree[pos].r <= R) return tree[pos].sum; int mid = tree[pos].mid(); int sum1 = 0, sum2 = 0; if (L <= mid) sum1 = query(L, R, pos << 1); if (R > mid) sum2 = query(L, R, pos << 1 | 1); return sum1 + sum2; }};Tree tree;int main(){ int x, y; int t, n,t_case=0; scanf("%d", &t); while (t--) { char ch[20]; scanf("%d", &n); printf("Case %d:\n", ++t_case); for (int i = 1; i <= n; i++) scanf("%d", &num[i]); tree.build(1, n, 1); while (scanf("%s", ch) != EOF) { if (strcmp(ch, "End") == 0) break; else if (strcmp(ch,"Add")==0) { scanf("%d%d", &x, &y); tree.updata(x, 1, y); } else if (strcmp(ch, "Sub") == 0) { scanf("%d%d", &x, &y); tree.updata(x, 1, -y); } else if (strcmp(ch, "Query") == 0) { scanf("%d%d", &x, &y); printf("%d\n", tree.query(x, y, 1)); } } } return 0;}

 

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/10079784.html

你可能感兴趣的文章
鼠标放在控件上显示提示信息
查看>>
open***
查看>>
开启golang之旅
查看>>
Android TableLayout表格布局
查看>>
我的友情链接
查看>>
对于Mysql大量数据查询速度慢的问题
查看>>
tomcat中的server.xml
查看>>
我的友情链接
查看>>
购物车--low版
查看>>
linux
查看>>
PHP中的替换strtr
查看>>
Apache和nginx 301重定向
查看>>
LINQ分页和排序,skip和Take 用法
查看>>
Activiti 查找流程状态(流程下一步)
查看>>
Delphi 密码限3次登录程序(附:源码)
查看>>
Linux中大量TIME_WAIT的解决办法
查看>>
Angular UI Route
查看>>
一个应届毕业生程序员的独白
查看>>
oracle的全局临时表
查看>>
python用sql的limit语句进行分页
查看>>