题目翻译:

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. 【Sklearn系列】使用Sklearn进行数据预处理

    这篇文章主要讲解使用Sklearn进行数据预处理,我们使用Kaggle中泰坦尼克号事件的数据作为样本. 读取数据并创建数据表格,查看数据相关信息 import pandas as pd import ...

  2. PHP代码审计2-常用超全局变量,常用命令注入,常用XSS漏洞审计,文件包含

    超全局变量 $GLOBALS — 引用全局作用域中可用的全部变量$_SERVER — 服务器和执行环境信息$_GET — HTTP GET 变量$_POST — HTTP POST 变量$_FILES ...

  3. Android 打印方法调用堆栈

    RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); Log.w(" ...

  4. Django 2.0官方文档中文 总索引

    Django 2.0官方文档中文 渣翻 总索引 翻译 2017年12月08日 11:19:1 官方原文: https://docs.djangoproject.com/en/2.0/ 当前翻译版本:  ...

  5. nodejs 操作mongodb, 增删改查

    很久没有学node了,之前书看了一半,今天继续学发现版本问题很坑爹,按书例子执行一堆错误.想学nodejs操作db,百度半天,一堆sb写神马鸟玩儿?简简单单写一大堆还运行不了的.需要代码也是看别人写的 ...

  6. 剑指Offer - 九度1520 - 树的子结构

    剑指Offer - 九度1520 - 树的子结构2013-11-30 22:17 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每 ...

  7. 《Cracking the Coding Interview》——第6章:智力题——题目5

    2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...

  8. 5.修改haproxy配置文件

    需求: 1.查 输入:www.oldboy.org 获取当前backend下的所有记录 2.新建 输入: arg = { 'backend': 'www.oldboy.org', 'record':{ ...

  9. NYOJ36 水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  10. hadoop2.5.2学习及实践笔记(六)—— Hadoop文件系统及其java接口

    文件系统概述 org.apache.hadoop.fs.FileSystem是hadoop的抽象文件系统,为不同的数据访问提供了统一的接口,并提供了大量具体文件系统的实现,满足hadoop上各种数据访 ...