线段树

本文介绍了一种使用C++实现的线段树数据结构,并详细解释了如何通过递归方式初始化线段树、更新节点颜色及计算每个节点的颜色值。通过实例展示了线段树的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define NOCOL -1 #define MULCOL -2 using namespace std; struct tree{ int l, r, col, mid; tree *lc, *rc; }; tree *root; int n, l, r, col, i; int color[8001], cnt[8001]; tree *init(int l, int r) //建立一棵线段树 { tree *rst; rst = (tree *)malloc(sizeof(tree)); rst->l = l, rst->r = r, rst->mid = (l + r) / 2, rst->col = NOCOL; if(r - l == 1) { rst->lc = NULL; rst->rc = NULL; } else { rst->lc = init(rst->l, rst->mid); rst->rc = init(rst->mid, rst->r); } return rst; } void put(tree *p, int l, int r, int col) { if(p->l == l && p->r == r) { p->col = col; return; } if(p->col != MULCOL) { p->lc->col = p->col; p->rc->col = p->col; p->col = MULCOL; } if(l < p->mid && r > p->mid) { put(p->lc, l, p->mid, col); put(p->rc, p->mid, r, col); } else { if(p->mid <= l) put(p->rc, l, r, col); else put(p->lc, l, r, col); } } void cal(tree *p, int *color) { int i; if(p->col == MULCOL) { cal(p->lc, color); cal(p->rc, color); } else if(p->col != NOCOL) for(i = p->l; i < p->r; i++) color[i] = p->col; else for(i = p->l; i < p->r; i++) color[i] = NOCOL; free(p); } int main() { while((scanf("%d", &n)) != EOF) { root = init(0, 8000); memset(color, 0, sizeof(color)); memset(cnt, 0, sizeof(cnt)); while(n--) { scanf("%d%d%d", &l, &r, &col); put(root, l, r, col); } cal(root, color); if(color[0] != NOCOL) cnt[color[0]]++; for(i = 1; i <= 7999; i++) if(color[i] != NOCOL && color[i] != color[i - 1]) { cnt[color[i]]++; } for(i = 0; i <= 8000; i++) if(cnt[i] > 0) printf("%d %d\n", i, cnt[i]); printf("\n"); } return 0; } 对不起大家了。。。。额,实在是自己刚开始学,真心有些东西还没搞明白的线段数是一个平衡树,树的高度为。

任两个结点要么是包含关系要么没有公共部分,不可能重叠。

给定一个叶子p,从根到p路径上所有结点代表的区间都包含点p,且其它结点代表的区间都不包含p。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值