码迷,mamicode.com
首页 > 其他好文 > 详细

字典树基础

时间:2019-02-08 13:02:53      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:clu   else   查询   pac   space   ace   pos   表示   style   

字典树:字典树用来储存区域信息

主要有五种操作:

建树、单点查询、单点修改、区间查询、区间修改。

#include<bits/stdc++.h>
using namespace std;

struct node
{
       int l,r,w;//l,r分别表示区间左右端点,w表示区间和
}tree[4*n+1];//字典树要开四倍空间

void build(int l,int r,int k)
{
    tree[k].l=l;tree[k].r=r;
    if(l==r)//叶子节点 
    {
        scanf("%d",&tree[k].w);
        return ; 
    }
    int m=(l+r)/2;
    build(l,m,k*2);//左孩子 
    build(m+1,r,k*2+1);//右孩子 
    tree[k].w=tree[k*2].w+tree[k*2+1].w;//状态合并,此结点的w=两个孩子的w之和 
}

int ask(int k,int pos)
{
    if(tree[k].l==tree[k].r) //当前结点的左右端点相等,是叶子节点,是最终答案 
    {
        return  tree[k].w;
    }
    int m=(tree[k].l+tree[k].r)/2;
    if(pos<=m) ask(k*2);//目标位置比中点靠左,就递归左孩子 
    else ask(k*2+1);//反之,递归右孩子 
}


void add(int k,int pos,int v)
{
    if(tree[k].l==tree[k].r)//找到目标位置 
    {
        tree[k].w+=v;
        return;
    }
    int m=(tree[k].l+tree[k].r)/2;
    if(pos<=m) add(k*2);
    else add(k*2+1);
    tree[k].w=tree[k*2].w+tree[k*2+1].w;//所有包含结点k的结点状态更新 
}



void sum(int k,int left,int right)
{
    if(tree[k].l>=left && tree[k].r<=right) 
    {
        ans+=tree[k].w;
        return;
    }
    int m=(tree[k].l+tree[k].r)/2;
    if(left<=m) sum(k*2);
    if(right>m) sum(k*2+1);
}

 

字典树基础

标签:clu   else   查询   pac   space   ace   pos   表示   style   

原文地址:https://www.cnblogs.com/bxd123/p/10356042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!