题目翻译:

zxyer来到了一个神奇的公司工作,之所以神奇,是因为这个公司的员工的职位并不与他们的水平相称,有的职位极低的职员的经验非常丰富,而有些经理甚至老板都是个萌新。有一天,zxyer收到了老板打来的电话,要求他安排一下让所有员工包括老板本人都去向下层员工学习一下工作经验。可是机智的zxyer很快就明白一件事情,显然不能安排一个员工到他的上司那儿学习经验,这样会太尴尬,同样就更不可能到上司的上司那儿去啦!所以只能安排一个员工到比它职位低的,且属于他管的员工那儿去学习经验。

并且,一个员工能够学习到经验当且仅当他要去学习的那位员工的经验值比他高,那么zxyer就把这个问题丢给了你,要求你求出每个员工能够向几位员工学习经验?

注:在本题中编号为1的员工为老板,他是没有上司的。且上司关系保证是一棵树。

输入:

1个整数n,表示共有n个员工,接下来第i+1行,每行一个整数,表示标号为i的员工的经验值,再接下来n-1行,每行一个整数。表示第2~n个员工的上司

输出:

一共n行,表示n个员工每个人可以学习到经验的人数

样例输入:

5

804289384

846930887

681692778

714636916

957747794

1

1

2

3

样例输出:

2

0

1

0

0

数据范围:

对于50%的数据 n<=2500

对于100%的数据 n<=100000 经验值ai<= 1000000000

————————————————我是分割线————————————————

这道题目稍难,需要巧解。

显然平衡树可以暴力过此题(多一个log,就是跑的慢)

然后我们讲讲巧解、

假如我们用权值线段树来求解这一道题,那么我们在dfs遍历整棵树的时候,在一个点放进权值线段树之前,先将答案减去目前在权值线段树中比该点权值大的数的个数,然后遍历这个点的子树,最后再在答案中加上目前在权值线段树中比该点权值大的数的个数,就是答案啦

当然,主席树也可以做这题,不过还是没标程跑的快QAQ

由于数据范围很大,所以需要离散。

下面贴代码

#include<cstdio>
#include<algorithm>
#define MN 100005
#define M 231072
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
int n,j=,tot;
int head[MN],s[MN],num[MN],ans[MN];
int t[M<<];
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
}
struct edge{
int to,next;
}g[MN];
void ins(int u,int v){g[++tot].next=head[u];head[u]=tot;g[tot].to=v;}
void update(int k,int add){
t[k+=M]+=add;
for(k>>=;k;k>>=)t[k]=t[ls]+t[rs];
}
int query(int l){
int sum=;
for(l+=M-;l!=;l>>=)
{
if(~l&)sum+=t[l+];
}
return sum;
}
void dfs(int x){
update(num[x],);
ans[x]=-query(num[x]);
for(int i=head[x];i;i=g[i].next)dfs(g[i].to);
ans[x]+=query(num[x]);
}
int main(){
freopen("boss.in","r",stdin);
freopen("boss.out","w",stdout);
n=read();
for(int i=;i<=n;i++)num[i]=s[i]=read();
sort(s+,s+n+);
for(int i=;i<=n;i++)
if(s[i]!=s[i-])s[++j]=s[i];
for(int i=;i<=n;i++)num[i]=lower_bound(s+,s+j+,num[i])-s;
int x;
for(int i=;i<n;i++)ins(read(),i+);
dfs();
for(int i=;i<=n;i++)printf("%d\n",ans[i]);
fclose(stdin);
fclose(stdout);
}

Promotion Counting(USACO)的更多相关文章

  1. 2018.08.27 [Usaco2017 Jan]Promotion Counting(线段树合并)

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

  2. BZOJ 4756 [Usaco2017 Jan]Promotion Counting(线段树合并)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4756 [题目大意] 给出一棵树,对于每个节点,求其子树中比父节点大的点个数 [题解] ...

  3. [BZOJ4756] [Usaco2017 Jan]Promotion Counting(线段树合并)

    传送门 此题很有意思,有多种解法 1.用天天爱跑步的方法,进入子树的时候ans-query,出去子树的时候ans+query,query可以用树状数组或线段树来搞 2.按dfs序建立主席树 3.线段树 ...

  4. POJ:2386 Lake Counting(dfs)

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40370   Accepted: 20015 D ...

  5. Codeforces 954H Path Counting(DP)

    题目链接  Path Counting 题意  给定一棵高度为$n$的树,给出每一层的每个点的儿子个数(某一层的所有点儿子个数相同).   令$f_{k}$为长度为$k$的路径条数,求$f_{1}, ...

  6. jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...

  7. Hoof, Paper, Scissors(USACO)

    题目大意: 一种游戏(类似于石头剪刀布):两个人分别给出一个字母,然后比较:H>S,S>P,P>H,我们已知对手的字母顺序,求在前n局中我们最多能赢多少次. 由于出字母的人非常懒,所 ...

  8. POJ 2386——Lake Counting(DFS)

    链接:http://poj.org/problem?id=2386 题解 #include<cstdio> #include<stack> using namespace st ...

  9. hdu3664 Permutation Counting(dp)

    hdu3664 Permutation Counting 题目传送门 题意: 在一个序列中,如果有k个数满足a[i]>i:那么这个序列的E值为k,问你 在n的全排列中,有多少个排列是恰好是E值为 ...

随机推荐

  1. chroot: cannot run command `/bin/bash': No such file&nbs

    最近在使用chroot去重新的挂载一个根目录,总是出现上面的问题,很烦,好久了没有解决, 然后自己就写了一个复制依赖库的脚本,然后发现可以切换了,然后就重新试着去挂载根目录 终于发现了原因. ---- ...

  2. dategrip破解

    https://blog.csdn.net/weixin_39428938/article/details/81078806

  3. java线程安全总结 - 2 (转载)

    原文地址:http://www.jameswxx.com/java/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93%EF%BC%88%E4 ...

  4. PHP.19-验证码生成

    生成验证码 思路:先定义验证码函数getCode() //绘制验证码 $num = 4; //字符长度 getCode($num, 2); 1.创建画布,分配颜色 imagecreatetruecol ...

  5. P3818 小A和uim之大逃离 II(洛谷月赛)

    P3818 小A和uim之大逃离 II 题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然 ...

  6. Linux & Windows 查看 ip 地址

    Windows 查看本机 IP 打开 cmd,输入 ipconfig,回车,找到IPv4地址 或者通过以下方式查看 点击Win10系统的右下角的宽带连接图标,如下图所示.        点击弹出菜单的 ...

  7. (原)Unreal源码搬山-动画篇 自定义动画节点(一)

    @author:黑袍小道 太忙了,来更新下,嘿嘿 前言: 本文是接着上文 Unreal搬山之动画模块_Unreal动画流程和框架,进行简单入门如何自定义动画图标的AnimNode. 正文: 一.Ani ...

  8. HDU 4288 Coder ( 离散化 + 离线 + 线段树 )

    这题跟ZOJ 3606的解题思路很相似. 题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9):2.从集合中删去一个数x(保证这个数存在):3.查询集合中所有位置满足i%5==3的数a[i]的 ...

  9. hdu 1203 01背包 I need a offer

    hdu 1203  01背包  I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offe ...

  10. 第二阶段团队冲刺-three

    昨天: 修复博客作业查询功能. 今天: 绘制logo. 遇到的问题: 无.