线段树 亦凉 2021-12-03 07:17 388阅读 0赞 线段树(单点修改) 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct node { 5 int start, end; 6 int val; 7 node *left, *right; 8 node(int _start, int _end) : 9 start(_start), end(_end), val(INT_MAX), left(NULL), right(NULL) {} 10 }; 11 12 node *buildTree(int start, int end) { 13 if (start > end) return NULL; 14 node *root = new node(start, end); 15 if (start == end) return root; 16 int mid = start + ((end - start) >> 1); 17 root->left = buildTree(start, mid); 18 root->right = buildTree(mid + 1, end); 19 return root; 20 } 21 22 void update(node *root, int idx, int val) { 23 if (idx == root->start && idx == root->end) { 24 root->val = val; 25 return; 26 } 27 int mid = root->start + ((root->end - root->start) >> 1); 28 if (idx >= root->start && idx <= mid) update(root->left, idx, val); 29 else if (idx > mid && idx <= root->end) update(root->right, idx, val); 30 root->val = min(root->left->val, root->right->val); 31 } 32 33 int query(node *root, int start, int end) { 34 if (start == root->start && end == root->end) return root->val; 35 int mid = root->start + ((root->end - root->start) >> 1); 36 if (end <= mid) return query(root->left, start, end); 37 if (start > mid) return query(root->right, start, end); 38 return min(query(root->left, start, mid), query(root->right, mid + 1, end)); 39 } 40 41 int N, Q; 42 int idx, val; 43 int op; 44 45 int main() { 46 cin >> N; 47 node *root = buildTree(1, N); 48 for (idx = 1; idx <= N; ++idx) { 49 cin >> val; 50 update(root, idx, val); 51 } 52 cin >> Q; 53 for (int i = 0; i < Q; ++i) { 54 cin >> op >> idx >> val; 55 if (op == 0) cout << query(root, idx, val) << endl; 56 else update(root, idx, val); 57 } 58 return 0; 59 } 线段树(区间修改) 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct node { 5 int start, end; 6 int val; 7 int tag; 8 node *left, *right; 9 node(int _start, int _end) : 10 start(_start), end(_end), val(0), tag(-1), 11 left(NULL), right(NULL) {} 12 }; 13 14 node *buildTree(int start, int end) { 15 if (start > end) return NULL; 16 node *root = new node(start, end); 17 if (start == end) return root; 18 int mid = start + ((end - start) >> 1); 19 root->left = buildTree(start, mid); 20 root->right = buildTree(mid + 1, end); 21 return root; 22 } 23 24 void update(node *root, int start, int end, int val) { 25 if (start == root->start && end == root->end) { 26 root->tag = val; 27 root->val = val * (end - start + 1); 28 return; 29 } 30 int mid = root->start + ((root->end - root->start) >> 1); 31 if (root->tag != -1) { 32 root->left->tag = root->tag; 33 root->left->val = root->tag * (root->left->end - root->left->start + 1); 34 root->right->tag = root->tag; 35 root->right->val = root->tag * (root->right->end - root->right->start + 1); 36 root->tag = -1; 37 } 38 if (end <= mid) update(root->left, start, end, val); 39 else if (start > mid) update(root->right, start, end, val); 40 else update(root->left, start, mid, val), update(root->right, mid + 1, end, val); 41 root->val = root->left->val + root->right->val; 42 } 43 44 int query(node *root, int start, int end) { 45 if (start == root->start && end == root->end) return root->val; 46 if (root->tag != -1) { 47 root->left->tag = root->tag; 48 root->left->val = root->tag * (root->left->end - root->left->start + 1); 49 root->right->tag = root->tag; 50 root->right->val = root->tag * (root->right->end - root->right->start + 1); 51 root->tag = -1; 52 } 53 int mid = root->start + ((root->end - root->start) >> 1); 54 if (end <= mid) return query(root->left, start, end); 55 if (start > mid) return query(root->right, start, end); 56 return query(root->left, start, mid) + query(root->right, mid + 1, end); 57 } 58 59 int N, Q; 60 int idx, val, st, ed; 61 int op; 62 63 int main() { 64 cin >> N; 65 node *root = buildTree(1, N); 66 for (idx = 1; idx <= N; ++idx) { 67 cin >> val; 68 update(root, idx, idx, val); 69 } 70 cin >> Q; 71 for (int i = 0; i < Q; ++i) { 72 cin >> op >> st >> ed; 73 if (op == 0) { 74 cout << query(root, st, ed) << endl; 75 } else { 76 cin >> val; 77 update(root, st, ed, val); 78 } 79 } 80 return 0; 81 } 转载于:https://www.cnblogs.com/easonliu/articles/4575506.html
相关 线段树 线段树:创建时实际做的是后序遍历 > 1. 线段树不是完全二叉树 > 2. 线段树是平衡二叉树 > 3. 堆也是平衡二叉树,故完全二叉树是平衡二叉树,平衡二叉树不一 朱雀/ 2023年07月10日 12:39/ 0 赞/ 7 阅读
相关 线段树 [http://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464583.html][http_www.cnblogs.com_s 迈不过友情╰/ 2022年09月20日 09:13/ 0 赞/ 274 阅读
相关 线段树 1、概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。 2、线段 分手后的思念是犯贱/ 2022年08月10日 10:53/ 0 赞/ 230 阅读
相关 线段树 Ⅱ 单点修改(内容有升级) \[hdu2795\] ([http://acm.hdu.edu.cn/showproblem.php?pid=2795][http_acm.hdu 朴灿烈づ我的快乐病毒、/ 2022年08月03日 13:45/ 0 赞/ 290 阅读
相关 线段树 线段树:一棵完全二叉树,每个节点代表一个区间。 关于单点更新: \[hdu1166 \] ([http://acm.hdu.edu.cn/showproblem.php?p ﹏ヽ暗。殇╰゛Y/ 2022年08月03日 13:45/ 0 赞/ 282 阅读
相关 线段树 线段树入门: 转载博客:[点击打开链接][Link 1] 前几天开始接触线段树,其一些基本的操作还是很容易理解的,但是区间更新我着实理解了好一会(因该是本人太菜),今天有时 Myth丶恋晨/ 2022年05月29日 22:16/ 0 赞/ 335 阅读
相关 线段树 一 概述 线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(l 川长思鸟来/ 2022年05月17日 05:53/ 0 赞/ 317 阅读
相关 线段树 线段树(单点修改) 1 include <bits/stdc++.h> 2 using namespace std; 3 4 stru 亦凉/ 2021年12月03日 07:17/ 0 赞/ 389 阅读
相关 线段树 转载 [https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html][https_www.cnblogs.com_TheRo 心已赠人/ 2021年07月16日 15:21/ 0 赞/ 525 阅读
还没有评论,来说两句吧...