中级农民
- 积分
- 106
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-6-20
- 最后登录
- 1970-1-1
|
Standard segment tree solution:
- #include <iostream>
- #include <vector>
- #include <assert.h>
- using namespace std;
- struct Node {
- Node* left, *right;
- int start, end, maxHei;
- Node(int s, int e): start(s), end(e), maxHei(0), left(NULL), right(NULL) {}
- };
- class SegTree {
- public:
- SegTree(int mr): minRange(1), maxRange(mr) {
- root = build(minRange, maxRange); // Initialize a range with height 0.
- }
-
- void drop(int position, int size) {
- int start = position, end = position + size - 1;
- int newHei = query(root, start, end) + size;
- modify(root, start, end, newHei);
- }
-
- int getHeight() {
- return root->maxHei;
- }
-
- private:
- Node* root;
- int minRange, maxRange;
-
- Node* build(int start, int end) {
- if(start > end) return NULL;
- if(start == end) {
- Node* newnode = new Node(start, start);
- return newnode;
- }
- Node* node = new Node(start, end);
- int mid = start + (end - start) / 2;
- node->left = build(start, mid);
- node->right = build(mid+1, end);
- return node;
- }
-
- int query(Node* node, int start, int end) {
- if(!node) return INT_MIN;
- if(node->start >= start && node->end <= end) return node->maxHei;
- if(node->start > end || node->end < start) return INT_MIN;
- return max(query(node->left, start, end), query(node->right, start, end));
- }
-
- void modify(Node* node, int start, int end, int newHei) {
- if(node->start > end || node->end < start) return;
- if(node->start == node->end) {
- node->maxHei = newHei;
- return;
- }
- modify(node->left, start, end, newHei);
- modify(node->right, start, end, newHei);
- node->maxHei = max(node->left->maxHei, node->right->maxHei);
- }
-
- };
- int main(int argc, const char * argv[]) {
- int maxRange = 10;
- SegTree seg(maxRange);
- seg.drop(1, 2);
- seg.drop(5, 3);
- assert(seg.getHeight() == 3);
- seg.drop(2, 4);
- assert(seg.getHeight() == 7);
- seg.drop(8, 3);
- assert(seg.getHeight() == 7);
- seg.drop(1, 4);
- assert(seg.getHeight() == 11);
- seg.drop(7, 2);
- return 0;
- }
复制代码 |
|