您的位置:首页 > 其它

简单线段树模板

2016-09-19 23:59 330 查看
                 例如:   给你任意几个数,给定N个区间,让你求这个区间的和;简单线段树的运用,帮助我更好的理解线段树,

            //线段树基本

#include<stdio.h>

#define MAXN 100100

#define MINN 10000100

int  num[MAXN],t[MINN];

void build(int L,int R,int d)

{      if(L==R)

         {   t[d]=num[L];

              return ;

         }

        else

        {    int mid=(L+R)/2;

             build(L,mid,d*2);

             build(mid+1,R,2*d+1);

        }

        t[d]=t[2*d]+t[2*d+1];//回溯很重要容易漏;

}

int inqure(int L,int R,int cl,int cr,int d)

{         if(L==cl&&R==cr)

           {  return t[d];

           }

           else

           {    

               int mid=(L+R)/2;

                if(cr<=mid)

                 return inqure(L,mid,cl,cr,d*2);

                else if(cl>mid)

                 return inqure(mid+1,R,cl,cr,d*2+1);

                else

                {      

                    return inqure(L,mid,cl,mid,d*2)+inqure(mid+1,R,mid+1,cr,d*2+1);//查找时候的判断分为三种情况,全在左面就左查,右面就右查,左右都有就两个都查然后相加;

                    

                }

           }

}

int main()

{    int t,n,i,l,r,q;

     scanf("%d",&t);

     while(t--)

     {   scanf("%d",&n);

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

        {   scanf("%d",&num[i]);

        }

           build(1,n,1);//从父结点开始建立//

          scanf("%d",&q);

          for(i=1;i<=q;i++)

            {  scanf("%d %d",&l,&r);

               int sum=inqure(1,n,l,r,1);//从树根开始查找;

               printf("%d\n",sum);

            }

         

      }

      return 0;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线段树