c语言线段树建树程序,C语言线段树

#include

#include

using namespace std;

struct node{

int s,t,c;

struct node *l,*r;

node(){

c=0;

l=r=NULL;

}

};

struct node *h;

int m,n;

int c_sum[100010];

void create_tree(struct node *x){

struct node *p,*q;

int mid;

if(x->t-x->s<=1)return ;

mid=(x->s+x->t)/2;

p=new node;

p->s=x->s;p->t=mid;

q=new node;

q->s=mid;q->t=x->t;

x->l=p;x->r=q;

create_tree(x->l);

create_tree(x->r);

return ;

}

void color(struct node *x,int u,int v,int z){

if(x==NULL)return ;

if(x->s==u && x->t==v){

x->c=z;

return ;

}else{

if(x->c!=-1){

x->l->c=x->c;

x->r->c=x->c;

x->c=-1;

}

if(u>=x->r->s)

color(x->r,u,v,z);

else if(v<=x->l->t)

color(x->l,u,v,z);

else{

color(x->l,u,x->l->t,z);

color(x->r,x->r->s,v,z);

}

}

}

void count(struct node *x){

if(x==NULL)return ;

if(x->c!=-1){

c_sum[x->c]+=x->t-x->s;

return ;

}

else{

count(x->l);

count(x->r);

}

return ;

}

int main(){

int i,j,k,m,n;

cin>>m>>n;

h=new node;

h->s=0;h->t=m;

create_tree(h);

int x,y;

for(i=1;i<=n;i++){

cin>>x>>y;

color(h,x,y,i);

}

count(h);

for(i=0;i<=n;i++)

if(c_sum[i])

cout<

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值