BZOJ 3653 主席树
2017-03-21 08:29
351 查看
思路:
(抄一波公式)
$$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 ,next[N*2],v[N*2],tot,root ; int dfn ,revdfn ,last ,cnt,deep ,size ,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\n",query(1,n,root[last[xx]],root[dfn[xx]],deep[xx],deep[xx]+yy)+min(deep[xx]-1,yy)*(1ll*size[xx]-1)); } }
相关文章推荐
- [BZOJ3653]谈笑风生(dfs序+主席树)
- 【BZOJ3653】谈笑风生【主席树】【DFS序】
- bzoj 3653: 谈笑风生 (主席树+dfs序)
- 【bzoj3653】【谈笑风生】【dfs序+主席树】
- 【BZOJ 3653】 谈笑风生|主席树
- [bzoj3653]谈笑风生 主席树
- 【主席树】bzoj3653 谈笑风生
- [主席树]BZOJ 3524——[Poi2014]Couriers
- Bzoj3653 谈笑风生
- 【bzoj3514】GERALD07加强版 LCT+主席树
- [bzoj3524/2223][Poi2014]Couriers_主席树
- BZOJ.2588.Count on a tree(主席树 静态树上第k小)
- BZOJ 2006 NOI 2010 超级钢琴 堆+主席树
- [bzoj2588][主席树]Count on a tree
- bzoj 4539: [Hnoi2016]树(缩点+主席树+lca)
- [BZOJ2653] middle - 主席树(可持久化线段树) - 二分
- 【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树
- bzoj4012 [HNOI2015]开店(动态点分治+二分+STL/树链剖分+主席树)
- 主席树+LCA【p2633 (bzoj2588】 Count on a tree
- [BZOJ3585][清华集训2014]mex 主席树