bzoj 4756: [Usaco2017 Jan]Promotion Counting (线段树合并)
来源:互联网 发布:乐视没有mac版怎么看4K 编辑:程序博客网 时间:2024/05/22 01:55
题解
传送门
题目大意:n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根。
问对于每个奶牛来说,它的子树中有几个能力值比它大的。
题解
线段树合并的裸题。感觉线段树合并在处理子树的问题中蛮好用的耶。
代码
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define N 100003using namespace std;int n,a[N],b[N],tot,nxt[N],point[N],v[N];int tr[N*20],ls[N*20],rs[N*20],root[N],cnt,sz,ans[N];void add(int x,int y){ tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void update(int now){ tr[now]=tr[ls[now]]+tr[rs[now]];}void insert(int &i,int l,int r,int x){ if (l>r) return; i=++sz; if (l==r) { tr[i]=1; return; } int mid=(l+r)/2; if (x<=mid) insert(ls[i],l,mid,x); else insert(rs[i],mid+1,r,x); update(i);}int merge(int x,int y){ if (!x) return y; if (!y) return x; ls[x]=merge(ls[x],ls[y]); rs[x]=merge(rs[x],rs[y]); update(x); return x;}int qjsum(int now,int l,int r,int ll,int rr){ if (rr<ll) return 0; if (ll<=l&&r<=rr) return tr[now]; int mid=(l+r)/2; int ans=0; if (ll<=mid) ans+=qjsum(ls[now],l,mid,ll,rr); if (rr>mid) ans+=qjsum(rs[now],mid+1,r,ll,rr); return ans;}void solve(int x){ for (int i=point[x];i;i=nxt[i]){ solve(v[i]); root[x]=merge(root[x],root[v[i]]); } ans[x]=qjsum(root[x],1,n,a[x]+1,cnt);}int main(){ freopen("a.in","r",stdin); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); cnt=unique(b+1,b+n+1)-b-1; for (int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+cnt+1,a[i])-b; for (int i=2;i<=n;i++) { int x; scanf("%d",&x); add(x,i); } for (int i=1;i<=n;i++) insert(root[i],1,n,a[i]); solve(1); for (int i=1;i<=n;i++) printf("%d\n",ans[i]);}
0 0
- bzoj 4756: [Usaco2017 Jan]Promotion Counting (线段树合并)
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting 线段树合并
- BZOJ[4756][Usaco2017 Jan]Promotion Counting 线段树合并
- 4756: [Usaco2017 Jan]Promotion Counting 线段树合并
- bzoj 4756: [Usaco2017 Jan]Promotion Counting
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting dfs序+主席树
- 4756: [Usaco2017 Jan]Promotion Counting
- BZOJ 4756 Promotion Counting(线段树合并 || dfs)
- 【bzoj 4756】Promotion Counting(线段树合并)
- BZOJ4756: [Usaco2017 Jan]Promotion Counting
- 【bzoj4756】[Usaco2017 Jan]Promotion Counting
- 【bzoj4756】[Usaco2017 Jan]Promotion Counting
- bzoj 4756: [Usaco2017 Jan]Promotion Counting dsu on tree+树状数组
- bzoj4756[Usaco2017 Jan]Promotion Counting 树上主席树
- USACO2016 Jan Bronze 1:Promotion Counting
- USACO2016 Jan Bronze 4:Promotion Counting
- bzoj 4756(线段树合并)
- [DP] BZOJ 4758 [Usaco2017 Jan]Subsequence Reversal
- SpringMVC中controller单例问题
- dup和dup2
- PCMan FTP Server缓冲区溢出漏洞分析与利用
- MacOS:编译运行C++源代码
- forward内部跳转 和redirect重定向跳转的区别
- bzoj 4756: [Usaco2017 Jan]Promotion Counting (线段树合并)
- Qt编程入门(2) : 自定义标题窗口(3)
- 算法时间复杂度和空间复杂度总结
- 工程规划 差分约束
- R语言S3、S4方法的定义以及实例化
- Python3爬虫之入门和正则表达式
- 多Kinect高精度骨架数据读取、整合与显示技术转让
- 数据结构--树和二叉树03
- javascript 数组方法属性总结