ACM模板 线段树

//线段树的节点

//节点包括两部分信息,基本域,和信息域

//基本域:左右边界leftboundary,rightboundary.  左右孩子:liftchild,rightchild //信息域:value值,如RMQ问题中,信息域中存储的是区间最大值

struct Node {

    int leftboundary,rightboundary;

    Node *leftchild,*rightchild;

    typedef value;

};

//空树的建立,内含value值的初始化;

//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树

Node *buildtree(int begin,int end)

{

    Node *p = new Node;//给P申请一块内存

    p -> leftboundary = begin;

    p -> rightboundary = end;

    //{p - > value 初始化}

    if(begin == end)

        return p;//叶子节点

    p -> leftchild = buildtree(begin,(begin + end));

    p -> rightchild = buildtree((begin + end) / 2 + 1,end);

    return p;

}

void insert(Node *T,int begin,int end,int value)

{

    if(begin <= T -> leftboundary && end >= T -> rightboundary)

    {

        //{根据value处理T -> value; 然后 return ;}

    }

    if(begin <= (T -> leftboundary + T -> rightboundary))

         insert(T -> leftchild,a,b,value);

    if(end > (T -> leftboundary + T -> rightboundary))

         insert(T -> rightchlid,a,b,value);

     //{根据T -> leftchild和T -> rightchild的信息处理T -> value}  (此处类似于归并排序中最后的合并操作) }

int search(Node *T,int begin,int end)

{

    int ans;

    if(begin <= T -> leftchild && end >= T -> rightchild)

       // {根据T -> value处理res;return res;}

    if(a <= (T -> leftchild + T -> rightchild) / 2)

        //{根据search(T -> leftchild,a,b)处理res}

    if(b > (T -> leftchild+T -> rightchild) / 2)

        //{根据search(T -> rightchild,a,b)处理res}

    return res;

}

什么是线段树:

线段树是一种用树状结构来存储一个连续区间的信息的数据结构

线段树的作用:

它主要用于处理一段连续区间的插入,查找,统计,查询等操作

复杂度:

设区间的长度是n,所有的操作的复杂度是logN级别的

线段树的性质:

1.线段树是平衡二叉树,最大深度为logN(N为线段树所标示的区间的长度)

2任意的线段树[a,b]在线段树的查询或查找过程中把这个线段最多分成log(b-a)份

以上两条性质保证了线段树除了建树外的操作都是Log(N)级别的复杂度

原文地址:https://www.cnblogs.com/GODLIKEING/p/3351641.html