线段树合并。

正解好像不是线段树合并,但是出于练手的目的写了线段树合并。

大概就是对于左右子树,如果有一个为空,返回非空的,如果都不为空,就把这两个整合到一起就行了。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=100005;
int tot,ls[N<<5],rs[N<<5],siz[N<<5],n,p[N],head[N],ecnt,lsh[N],LSH,ans[N],rt[N];
struct Edge{int to,nxt;}e[N<<1];
void add(int bg,int ed){e[++ecnt].to=ed;e[ecnt].nxt=head[bg];head[bg]=ecnt;}
void pushup(int x) {siz[x]=siz[ls[x]]+siz[rs[x]];}
void update(int &k,int l,int r,int val) {
if(!k)k=++tot;int mid=l+r>>1;
if(l==r) {siz[k]++;return;}
if(val<=mid) update(ls[k],l,mid,val);
else update(rs[k],mid+1,r,val);
pushup(k);
}
int query(int ql,int qr,int l,int r,int cur) {
int mid=l+r>>1;
if(ql<=l&&r<=qr) return siz[cur];
int sum=0;
if(ql<=mid) sum+=query(ql,qr,l,mid,ls[cur]);
if(qr>mid) sum+=query(ql,qr,mid+1,r,rs[cur]);
return sum;
}
int merge(int u,int v) {
if(u*v==0) return u+v;
ls[u]=merge(ls[u],ls[v]);
rs[u]=merge(rs[u],rs[v]);
pushup(u);
return u;
}
void dfs(int x,int fa) {
for(int i=head[x];i;i=e[i].nxt) {
int v=e[i].to;
if(v==fa) continue;
dfs(v,x);
rt[x]=merge(rt[x],rt[v]);
}
ans[x]=query(p[x]+1,n,1,n,rt[x]);
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&p[i]),lsh[++LSH]=p[i];
sort(lsh+1,lsh+1+LSH);
int u=unique(lsh+1,lsh+1+LSH)-lsh-1;
for(int i=1;i<=n;i++) p[i]=lower_bound(lsh+1,lsh+1+u,p[i])-lsh;
for(int i=2,fa;i<=n;i++) scanf("%d",&fa),add(i,fa),add(fa,i);
for(int i=1;i<=n;i++) update(rt[i],1,n,p[i]);
dfs(1,0);for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}

[USACO17JAN]Promotion Counting的更多相关文章

  1. Luogu3605 [USACO17JAN]Promotion Counting晋升者计数

    Luogu3605 [USACO17JAN]Promotion Counting晋升者计数 给一棵 \(n\) 个点的树,点 \(i\) 有一个权值 \(a_i\) .对于每个 \(i\) ,求 \( ...

  2. 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...

  3. 树状数组 P3605 [USACO17JAN]Promotion Counting晋升者计数

    P3605 [USACO17JAN]Promotion Counting晋升者计数 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 ...

  4. 洛谷P3605 [USACO17JAN] Promotion Counting 晋升者计数 [线段树合并]

    题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...

  5. [USACO17JAN]Promotion Counting晋升者计数

    题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1 \cdots N(1 \leq N \leq 100, 000)1⋯N(1≤N ...

  6. luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题目链接 luogu 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并... 看代码吧 错误 和写主席树错的差不多 都是变量写错.... 代码 #include <bits ...

  7. P3605 [USACO17JAN]Promotion Counting晋升者计数

    思路 线段树合并的板子.. 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include < ...

  8. BZOJ4756 [USACO17JAN]Promotion Counting晋升者计数

    Description The cows have once again tried to form a startup company, failing to remember from past ...

  9. [USACO17JAN] Promotion Counting晋升者计数 (树状数组+dfs)

    题目大意:给你一棵树,求以某节点为根的子树中,权值大于该节点权值的节点数 本题考查dfs的性质 离散+树状数组求逆序对 先离散 我们发现,求逆序对时,某节点的兄弟节点会干扰答案 所以,我们在递推时统计 ...

随机推荐

  1. ThreadPoolExecutor源码分析(一)

    一.前言 闲来无事,博主有重新翻看了一下jdk1.8版的ThreadPoolExecutor源码,看后写此笔记,画个圈圈,做个记录,这段源码,我看过,到处一游,嘻嘻~~ 二.ThreadPoolExe ...

  2. KeyEvent 键码值

    A 至 Z 键与 A – Z 字母的 ASCII 码同样: 值 描写叙述 65 A 键 66 B 键 67 C 键 68 D 键 69 E 键 70 F 键 71 G 键 72 H 键 73 I 键 ...

  3. 自己定义UISlider的样式和滑块

    //自己定义UISlider的样式和滑块 //轨道图片 UIImage *stetchLeftTrack = [UIImage imageNamed:@"thick"]; UIIm ...

  4. [寒江孤叶丶的Cocos2d-x之旅_32]微信输入框风格的IOS平台的EditBox

    原创文章,欢迎转载.转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 偶然看到一个游戏注冊账号时候,输入框是弹 ...

  5. Java学习需要掌握的一些知识

    Java学习需要掌握的一些知识: <一>1.Jvm 部分Jvm 内存模型.Jvm 内存结构.Jvm 参数调优.Java 垃圾回收<二>Java 基础部分1.必须会使用 List ...

  6. Linux命令(六)——软件包管理(安装应用程序)

    与windows安装各种应用程序相似,在linux下也可以安装各种需要的应用程序,通常称为软件包.目前,在linux系统下常见的软件包格式主要有:RPM包.TAR包.bz2包.gz包.deb包.sh结 ...

  7. bzoj2819: Nim(博弈+树剖)

    2819: Nim 题目:传送门 题解: 很久之前学博弈的时候看过的一道水题,其实算不上博弈吧... 直接套上一个裸的树剖啊,把路径上的点值全都xor(xor满足结合率所以就不管那么多随便搞啦) do ...

  8. sublime界面主题

    一直以来都是使用的SUBLIME,真的很强大. 最近刚转到linux来学习C,把它重新配置了一遍,默认的字体颜色的搭配已经很不错了.不过界面的样子还是不太习惯.重新安装了下soda这个主题包,惭愧!即 ...

  9. 建模:3D建模

    ylbtech-建模:3D建模 “3D建模”通俗来讲就是通过三维制作软件通过虚拟三维空间构建出具有三维数据的模型.3D建模大概可分为:NURBS和多边形网格. NURBS对要求精细.弹性与复杂的模型有 ...

  10. js作业

    1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米var sum=0;i=0;a=0.0001;for(i=0;i<100;i++){ a=a*2; sum=sum ...