第一次写的线段树

今天在纸上随便画了画就去敲。。也不知道对不对,先贴着。。
  1. #include <iostream>
  2. using namespace std;
  3. typedef struct Segment* Seglink;
  4. int ans;
  5. struct Segment
  6. {
  7.     int L,R,tLen;
  8.     bool flag;
  9.     Seglink left,right;
  10. };
  11. struct Segtree
  12. {
  13.     Segment root;
  14.     int tLen;
  15.     Segtree(int _L,int _R){root.flag=false;root.L=_L;root.R=_R;root.tLen=0;root.left=root.right=NULL;}
  16. };
  17. void make(int L,int R,Seglink node)
  18. {
  19.     int Mid=(L+R)/2;
  20.     node->flag=false;
  21.     node->L=L;
  22.     node->R=R;
  23.     node->tLen=R-L;
  24.     if(Mid-L>=1)
  25.     {node->left=(Seglink)malloc(sizeof(Segment));make(L,Mid,node->left);}
  26.     else node->left=NULL;
  27.     if(R-Mid>=1&&Mid!=L)
  28.     {node->right=(Seglink)malloc(sizeof(Segment));make(Mid,R,node->right);}
  29.     else node->right=NULL;
  30.     
  31. }
  32. void dfs(Seglink node)
  33. {
  34.     cout<<'['<<node->L<<','<<node->R<<']'<<"Len:"<<node->tLen<<"flag?="<<(node->flag)<<endl;
  35.     if(node->left!=NULL)dfs(node->left);
  36.     if(node->right!=NULL)dfs(node->right);
  37. }
  38. void insert(Seglink node,int L,int R)
  39. {
  40.     if(L==node->L&&R==node->R)
  41.     {node->flag=true;return;}
  42.     int tM=(node->L+node->R)/2;
  43.     if(R<=tM)
  44.         insert(node->left,L,R);
  45.     else
  46.     if(L>=tM)
  47.         insert(node->right,L,R);
  48.     else
  49.         insert(node->left,L,tM),insert(node->right,tM,R);
  50. }
  51. void GetTlen(Seglink node)
  52. {
  53.     if(node->flag){ans+=node->tLen;return;}
  54.     if(node->left!=NULL)GetTlen(node->left);
  55.     if(node->right!=NULL)GetTlen(node->right);
  56. }
  57. int main()
  58. {
  59.     const bool DEBUG=false;
  60.     Segtree T(1,100000);
  61.     if(DEBUG)OPEN
  62.     make(1,100000,&T.root);
  63.     int n,L,R;
  64.     cin>>n;
  65.     while(n--)
  66.     {
  67.         cin>>L>>R;
  68.         if(DEBUG)cout<<L<<' '<<R<<endl;
  69.         if(L>R)swap(L,R);
  70.         if(L!=R)insert(&T.root,L,R);
  71.         if(DEBUG)dfs(&T.root);
  72.     }
  73.     ans=0;
  74.     GetTlen(&T.root);
  75.     cout<<ans<<endl;
  76.   return 0;
  77. }
又看了好半天,用数组直接搞,作为模板贴贴~
  1. int ans;
  2. bool flag[1000000];
  3. struct Segment
  4. {
  5.     int L,R,tLen;
  6.     bool flag;
  7. }seg[1000000];
  8. void make(int L,int R,int node)
  9. {
  10.     int Mid=(L+R)/2;
  11.     seg[node].flag=false;
  12.     flag[node]=true;
  13.     seg[node].L=L;
  14.     seg[node].R=R;
  15.     seg[node].tLen=R-L;
  16.     if(Mid-L>=1)make(L,Mid,2*node);
  17.     if(R-Mid>=1&&Mid!=L)make(Mid,R,2*node+1);   
  18. }
  19. void dfs(int node)
  20. {
  21.     cout<<'['<<seg[node].L<<','<<seg[node].R<<']'<<"Len:"<<seg[node].tLen<<"flag?="<<(seg[node].flag)<<endl;
  22.     if(flag[2*node])dfs(2*node);
  23.     if(flag[2*node+1])dfs(2*node+1);
  24. }
  25. void insert(int node,int L,int R)
  26. {
  27.     if(!flag[node])return;
  28.     if(L==seg[node].L&&R==seg[node].R)
  29.     {seg[node].flag=true;return;}
  30.     int tM=(seg[node].L+seg[node].R)/2;
  31.     if(R<=tM)
  32.         insert(2*node,L,R);
  33.     else
  34.     if(L>=tM)
  35.         insert(2*node+1,L,R);
  36.     else
  37.         insert(2*node,L,tM),insert(2*node+1,tM,R);
  38. }
  39. void GetTlen(int node)
  40. {
  41.     if(seg[node].flag){ans+=seg[node].tLen;return;}
  42.     if(flag[2*node])GetTlen(2*node);
  43.     if(flag[2*node+1])GetTlen(2*node+1);
  44. }

你可能感兴趣的:(null,insert)