Promotion Counting(USACO)
题目翻译:
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)的更多相关文章
- 2018.08.27 [Usaco2017 Jan]Promotion Counting(线段树合并)
描述 The cows have once again tried to form a startup company, failing to remember from past experienc ...
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting(线段树合并)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4756 [题目大意] 给出一棵树,对于每个节点,求其子树中比父节点大的点个数 [题解] ...
- [BZOJ4756] [Usaco2017 Jan]Promotion Counting(线段树合并)
传送门 此题很有意思,有多种解法 1.用天天爱跑步的方法,进入子树的时候ans-query,出去子树的时候ans+query,query可以用树状数组或线段树来搞 2.按dfs序建立主席树 3.线段树 ...
- POJ:2386 Lake Counting(dfs)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40370 Accepted: 20015 D ...
- Codeforces 954H Path Counting(DP)
题目链接 Path Counting 题意 给定一棵高度为$n$的树,给出每一层的每个点的儿子个数(某一层的所有点儿子个数相同). 令$f_{k}$为长度为$k$的路径条数,求$f_{1}, ...
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
- Hoof, Paper, Scissors(USACO)
题目大意: 一种游戏(类似于石头剪刀布):两个人分别给出一个字母,然后比较:H>S,S>P,P>H,我们已知对手的字母顺序,求在前n局中我们最多能赢多少次. 由于出字母的人非常懒,所 ...
- POJ 2386——Lake Counting(DFS)
链接:http://poj.org/problem?id=2386 题解 #include<cstdio> #include<stack> using namespace st ...
- hdu3664 Permutation Counting(dp)
hdu3664 Permutation Counting 题目传送门 题意: 在一个序列中,如果有k个数满足a[i]>i:那么这个序列的E值为k,问你 在n的全排列中,有多少个排列是恰好是E值为 ...
随机推荐
- python3 练习题100例 (十六)鸡尾酒疗法
#!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'Fan Lijun' n = input('请输入一个大于1,小于等于20的整 ...
- 各种Nand的总结
1. 微观 NAND闪存NAND是非易失性存储技术,NAND闪存由多个存放以位(bit)为单位的单元构成,这些位通过电荷被打开或关闭,如何组织这些开关单元来储存在SSD上的数据,也决定了NAND闪存的 ...
- POJ:2395-Out of Hay
Out of Hay Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18780 Accepted: 7414 Descripti ...
- 原理剖析-Netty之服务端启动工作原理分析(下)
一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...
- 远程 RADIUS 服务器组
远程 RADIUS 服务器组 远程 RADIUS 服务器组是包含一个或多个 RADIUS 服务器的已命名的组.IAS 用作 RADIUS 请求消息的 RADIUS 代理时,必须指定远程 RADIUS ...
- VSX-3 VSCT文件
关于VSPackage中的VSCT,算是VSX开发中比较重要的一个成员. 我这里给出LearnVSXNow!系列文章关于VSCT的链接,除了#14有译文. #14 #18 #25 看完上面几篇文章,也 ...
- ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些
1.对应基本数据类型默认关键字是 atomic,readwrite,assign 2.对于普通的 Objective-C 对象 atomic,readwrite,strong
- Python3的unittest用例按编写顺序执行
unittest是Python标准库自带的单元测试框架,是Python版本的JUnit,关于unittest框架的使用,官方文档非常详细,网上也有不少好的教程,这里就不多说了. 本文主要分享在使用un ...
- Lua3
Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示. 1.数组 使用整数来索引table即可在Lua中实 ...
- Small组件化重构安卓项目
如果从一开始就没有设计好 后面项目业务比较大的时候很难掉头