【bzoj 4756】Promotion Counting(线段树合并)
2017-12-04 10:14
323 查看
传送门biu~
对于每一个节点建一个权值线段树。遍历每一棵子树,然后将子树的线段树合并到自己的线段树上。
对于每一个节点建一个权值线段树。遍历每一棵子树,然后将子树的线段树合并到自己的线段树上。
#include<bits/stdc++.h> #define N 100005 using namespace std; int n,ans ; struct Node{ Node*ch[2]; int L,R,sum; Node(int l,int r){ L=l;R=r; sum=0; ch[0]=ch[1]=NULL; } Node(){} void maintain(){ sum=0; if(ch[0]) sum+=ch[0]->sum; if(ch[1]) sum+=ch[1]->sum; } }*root ; void Merge(Node* &x,Node* &y){ if(!y) return; if(!x){ x=y; return; } x->sum+=y->sum; Merge(x->ch[0],y->ch[0]); Merge(x->ch[1],y->ch[1]); } void Insert(Node* &x,int v,int L,int R){ if(!x) x=new Node(L,R); if(x->L==x->R){ ++x->sum; return; } int mid=L+R>>1; if(v<=mid) Insert(x->ch[0],v,L,mid); else Insert(x->ch[1],v,mid+1,R); x->maintain(); } int Query(Node* x,int v){ if(!x) return 0; if(v==x->R) return x->sum; int mid=x->L+x->R>>1; if(v<=mid) return Query(x->ch[0],v); return (x->ch[0] ? x->ch[0]->sum : 0) + Query(x->ch[1],v); } int a ,b ; int head ,nex ,to ,tp; void add(int x,int y){ nex[++tp]=head[x]; head[x]=tp; to[tp]=y; } void dfs(int x){ for(int i=head[x];i;i=nex[i]){ dfs(to[i]); Merge(root[x],root[to[i]]); } ans[x]=Query(root[x],n-a[x]); Insert(root[x],n-a[x]+1,1,n); } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); int m=unique(b+1,b+n+1)-b-1; for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+m+1,a[i])-b; for(int i=2;i<=n;++i){ int x; scanf("%d",&x); add(x,i); } dfs(1); for(int i=1;i<=n;++i) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- BZOJ 4756 Promotion Counting(线段树合并 || dfs)
- BZOJ[4756][Usaco2017 Jan]Promotion Counting 线段树合并
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting 线段树合并
- bzoj4756: [Usaco2017 Jan]Promotion Counting 线段树合并
- BZOJ 4756 线段树合并(线段树)
- [BZOJ4756] [Usaco2017 Jan]Promotion Counting(线段树合并)
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting(线段树合并)
- bzoj 4756: [Usaco2017 Jan]Promotion Counting (线段树合并)
- bzoj 4756(线段树合并)
- BZOJ 2733 永无乡 [线段树合并]
- 【bzoj2325】[ZJOI2011]道馆之战 树链剖分+线段树区间合并
- bzoj4919 大根堆(线段树合并)
- 【UOJ261 BZOJ 】天天爱跑步(线段树合并)
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
- BZOJ 2212 [Poi2011]Tree Rotations(线段树合并)
- bzoj 3545: [ONTAK2010]Peaks 线段树合并
- bzoj 2212: [Poi2011]Tree Rotations 线段树合并
- bzoj3702二叉树 线段树合并
- BZOJ.4919.[Lydsy1706月赛]大根堆(线段树合并/启发式合并)
- BZOJ 2957: 楼房重建 [线段树 信息合并]