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