线段树
来源:互联网 发布:《和阅读》软件 编辑:程序博客网 时间:2024/05/18 09:18
先看下线段树的介绍,下面这个链接讲得还不错 http://hi.baidu.com/semluhiigubbqvq/item/be736a33a8864789f4e4ad18
本文所讲的线段树和该文有微小区别,在该文中节点[0, 7]的左儿子为[0,3],右儿子为[4,7],不包含mid,而我们的线段树是包含的,即昨儿子为[0,3],右儿子为[3,7]。
现在我们用线段树解决以下问题(小米笔试题):
给定n个线段,每个线段告诉起点和终点,求线段总长度和,重合的部分只算一次。例如[0,3],[2,5],线段长度总和为[0,5]为5。实现代码如下:
#include <iostream>using namespace std;struct node{ int left; int right; int cover; node() { cover = 0; }};class LineSegmentTree{ private: node *tree; public: LineSegmentTree() {}; LineSegmentTree(int left, int right); ~LineSegmentTree(); void init(int left, int right, int root); void insert(int left, int right, int root=1); int sum(int root=1);};LineSegmentTree:: LineSegmentTree(int left, int right){ tree = new node[(right-left)*3](); init(left, right, 1);}void LineSegmentTree:: init(int left, int right, int root){ tree[root].left = left; tree[root].right = right; if(right - left == 1) { return; } int mid = (left + right) / 2; init(left, mid, 2*root); init(mid, right, 2*root+1);}void LineSegmentTree:: insert(int left, int right, int root){ if(right <= left) { return; } if(left == tree[root].left && right == tree[root].right) { tree[root].cover++; return; } int mid = (tree[root].right + tree[root].left) / 2; if(mid >= right) { insert(left, right, 2*root); } else if(mid <= left) { insert(left, right, 2*root+1); } else { insert(left, mid, 2*root); insert(mid, right, 2*root+1); }}int LineSegmentTree:: sum(int root){ if(tree[root].cover >= 1) { return tree[root].right - tree[root].left; } else if(tree[root].right - tree[root].left == 1) { return 0; } else { return sum(2*root) + sum(2*root+1); }}LineSegmentTree:: ~LineSegmentTree(){ delete[] tree;}int main(){ LineSegmentTree t(1, 15); t.insert(1, 4); t.insert(3, 5); t.insert(2, 6); t.insert(3, 5); t.insert(2, 3); t.insert(12, 13); t.insert(8, 13); cout<<t.sum()<<endl; return 0;}
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- iOS 滤镜 和 iOS6 中的Core Image技术
- 重写Object中的equals方法
- Qt开发:Qt+OpenCV在(Linux平台)PC上采集摄像头视频(源码奉送)
- log4j和spring 3.1整合
- Android/linux(earlysuspend、lateresume)睡眠唤醒机制简介
- 线段树
- 浅析HTML5在移动应用开发中的使用
- mysql 技巧
- 用GDB调试程序
- Android 设置EditText不显示光标
- ORACLE PO采购订单界面
- 在iPhone上使用 OpenCV
- uva 11549 - Calculator Conundrum
- C语言实现学生信息管理系统