今天开始学习线段树,写了两个函数,也没有调试过,不知对不对~呵呵。。。
- #include<iostream>
- using namespace std;
- struct segment_tree
- {
- int l,r,n;
- struct segment_tree *left , *right;
- };
- void build ( segment_tree *t , int l , int r )
- {
- int m;
- segment_tree *p;
- if ( l>r )
- return ;
- m=(l+r)/2;
- if ( l==r && m==l )
- return;
- p=new segment_tree;
- p->l=l,p->r=m,p->n=0;
- t->left=p;
- build(p,l,m);
- p=new segment_tree;
- p->l=m+1,p->r=r,p->n=0;
- t->right=p;
- build(p,m+1,r);
- }
- void insert ( segment_tree *t , int l , int r )
- {
- int m;
- if ( t->l==l && t->r==r )
- {
- t->n++;
- return ;
- }
- if ( t->l==t->r )
- return;
- m=(t->l+t->r)>>1;
- if ( m>=r )
- insert(t->left , l , m );
- else
- if ( m<l )
- insert(t->right , m+1, r );
- else
- {
- insert(t->left , l , (l+r)>>1 );
- insert(t->right, (l+r)>>1 , r );
- }
- }