线段树

#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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值