博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 1166 敌兵布阵
阅读量:5051 次
发布时间:2019-06-12

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

线段树的入门题,数组代替树;

线段树是一种完全二叉树,主要操作有建树、修改节点、区间询问(最大值或者和等),由于采用二叉树结构,对一个结点的操作复杂为 logn;

这里建树、修改和询问操作没有采用递归方式,主要是利用了线段树也是完全二叉树的特点,因此可以直接根据要查看节点的编号(1..n)求得其对应在树中的编号,就可以直接进行操作,而不需要递归来实现。

# include 
# include
# define N (1 << 17)# define M ((1 << 16) )int segSum[N];void initTree(void){ segSum[0] = 0; memset(segSum, 0, sizeof(segSum));}int query(int Left, int Right){ int ret; ret = 0; Left += M-1, Right += M+1; while ((Right ^ Left) != 1) { if ((Left&0x1) == 0) ret += segSum[Left+1]; if ((Right&0x1) == 1) ret += segSum[Right-1]; Left >>= 1, Right >>= 1; } return ret;}void add(int i, int dx){ int p; p = i + M; while (p != 0) { segSum[p] += dx; p >>= 1; }}int main(){ char buf[10]; int T, n, i, j, x, k; scanf("%d", &T); for (k = 1; k <= T; ++k) { initTree(); scanf("%d", &n); for (i = 1; i <= n; ++i) { scanf("%d", &x); add(i, x); } printf("Case %d:\n", k); while (1) { scanf("%s", buf); if (buf[0] == 'E') break; scanf("%d%d", &i, &j); if (buf[0] == 'Q') printf("%d\n", query(i, j)); else if (buf[0] == 'A') add(i, j); else if (buf[0] == 'S') add(i, -j); } } return 0;}

//

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/07/08/2581677.html

你可能感兴趣的文章
浪涌、群脉冲、ESD等级标准
查看>>
shell sed 命令
查看>>
关于计算机编程语言——编译型和解释型_2
查看>>
oracle 约束constraint
查看>>
Javascript中的面向对象和定时器, BOM
查看>>
Reading comprehension HDU - 4990 (矩阵快速幂 or 快速幂+等比数列)
查看>>
ASP 手工语句
查看>>
Java Build Practice 1:Ant
查看>>
3.RxJava详解
查看>>
【小波变换】STL版 一维离散小波变换(DWT)库,完全按matlab的wavelet toolbox 的API实现的...
查看>>
作业六:小学生四则运算之NABCD模型与产品Backlog。
查看>>
SQL 十位随机数(大小写字母+数据)
查看>>
[BZOJ]1116: [POI2008]CLO
查看>>
c#泛型action<T>委托
查看>>
__int128的实现
查看>>
R 读取clipboard内容 (MAC)
查看>>
Problem - 1118B - Codeforces(Tanya and Candies)
查看>>
jdk1.8 api 下载
查看>>
svn 图标不显示
查看>>
getElement的几中属性介绍
查看>>