随笔分类 -  ACM--线段树

划分树 POJ2104
摘要:划分树理解:建树的时候,bulid(int f,int e,int root,int d),在区间[f,e]中,将线段树左右端点(root的左右值)设为f和e。当前层是第d层,将下一层的左右子树分类好,即算出这一层在[f,e]区间的中值data[mid],之后小于data[mid]的值放d+1层的左边,大于data[mid]的值放d+1层的右边。建完树之后会打表将建树的过程在每一层记录下来。最多建20层,因为2^20已经足够存储很大的数列了。update的时候通过递归,确定在下一层左右哪一个子树,递归到下一层的时候减小所求区间,直到区间长度为1时,返回区间值。 1 #include <i 阅读全文

posted @ 2012-08-04 12:29 HUJJ 阅读(302) 评论(0) 推荐(0)

hdu1698--线段树更新区间
摘要:线段树 更新整个区间不要一直更新到节点,用一个标记值-1标记是否杂色。更新的时候如果该段正好是要更新的段则将其更新即可。否则说明要更新的段与当前的tt[step]这一段不一致,则要将tt[step]这一段拆分成2段,递归调用更新step*2及step*2+1,更新后tt[step]将变成杂色。所以将子段先赋予其父段tt[step]的颜色,并将tt[step]标记为杂色,在递归调用update。 1 //Accepted 1698 406MS 3308K 1263 B C++ hujj 2 #include<iostream> 3 #include<string> 4 # 阅读全文

posted @ 2012-07-13 09:52 HUJJ 阅读(410) 评论(0) 推荐(0)

hdu--1754 线段树区间求最大值
摘要:线段树区间求最大值简单入门题每次更新的时候递归找到最终的叶子更新完叶子节点值,之后在返回更新父亲节点的值。 1 #include<iostream> 2 #include<string> 3 #define MAX 200010 4 using namespace std; 5 int num[MAX]; 6 struct SegTree 7 { 8 int left,right,value; 9 int calmid()10 {11 return (left+right)>>1;12 }13 }tt[MAX*3];14 15 int bulid... 阅读全文

posted @ 2012-07-12 16:48 HUJJ 阅读(392) 评论(0) 推荐(0)

hdu--1166 线段树区间求和
摘要:线段树区间求和简单入门题目对于每一次输入的数组序列建树每一次增加减少操作为更新操作,更新过程每个端点的和都更新 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 #define MAX 50010 5 int num[MAX]; 6 struct SegTree 7 { 8 int left,right,value; 9 int calmid(){10 return (left+right)/2;11 }12 }tt[MAX*3];13 14 int bulid(int ... 阅读全文

posted @ 2012-07-12 11:08 HUJJ 阅读(397) 评论(0) 推荐(0)