zoukankan      html  css  js  c++  java
  • BZOJ 3653 主席树

    思路:

    (抄一波公式)

    $$ans=min(dep[x],k)×(size[x]-1)+sum_{y在x的子树中,且dis(x,y)<=k}(size[y]-1)$$

    顺着DFS序

    按照deep往线段树里插就好了...

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=300050;
    int n,q,xx,yy,first[N],next[N*2],v[N*2],tot,root[N];
    int dfn[N],revdfn[N],last[N],cnt,deep[N],size[N],lson[N*30],rson[N*30];
    long long tree[N*30];
    void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
    void dfs(int x,int fa){
        dfn[x]=++cnt,revdfn[cnt]=x,size[x]=1;
        for(int i=first[x];~i;i=next[i])if(v[i]!=fa){
            deep[v[i]]=deep[x]+1,dfs(v[i],x),size[x]+=size[v[i]];
        }last[x]=cnt;
    }
    void insert(int l,int r,int &pos,int last,int num,int wei){
        pos=++cnt,tree[pos]=tree[last]+wei;
        if(l==r)return;
        int mid=(l+r)>>1;
        if(mid<num)lson[pos]=lson[last],insert(mid+1,r,rson[pos],rson[last],num,wei);
        else rson[pos]=rson[last],insert(l,mid,lson[pos],lson[last],num,wei);
    }
    long long query(int l,int r,int pos,int last,int L,int R){
        if(l>=L&&r<=R)return tree[pos]-tree[last];
        int mid=(l+r)>>1;
        if(mid<L)return query(mid+1,r,rson[pos],rson[last],L,R);
        else if(mid>=R)return query(l,mid,lson[pos],lson[last],L,R);
        else return query(l,mid,lson[pos],lson[last],L,R)+query(mid+1,r,rson[pos],rson[last],L,R);
    }
    int main(){
        memset(first,-1,sizeof(first));
        scanf("%d%d",&n,&q);
        for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
        deep[1]=1,dfs(1,0);
        for(int i=1;i<=n;i++)insert(1,n,root[i],root[i-1],deep[revdfn[i]],size[revdfn[i]]-1);
        while(q--){
            scanf("%d%d",&xx,&yy);
            printf("%lld
    ",query(1,n,root[last[xx]],root[dfn[xx]],deep[xx],deep[xx]+yy)+min(deep[xx]-1,yy)*(1ll*size[xx]-1));
        }
    }
  • 相关阅读:
    ThinPHP v5.x安装初始化配置(项目实战)
    Bresenham快速画直线算法
    arm笔记之MOV
    Blackfin DSP的C语言优化之Circular Buffer
    Visual DSP定点数(fract)使用指南
    全局二值化
    Blackfin DSP学习心得与参考资料
    Linux网络配置
    一般方程与参数方程求直线交点
    一个改进的快速排序实现
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6592644.html
Copyright © 2011-2022 走看看