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值为 ...
随机推荐
- linux无名管道
特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...
- 005--Django2.0的路由层
URL配置就像Django所支撑的网站目录,它的本质是每条URL调用的视图函数的映射表,每一个请求执行对应的视图函数. 1.简单的路由配置 from django.contrib import ad ...
- X的N次方。N比较大。
final static long DIV = 1000000009; //分治法, 注意java类型为long, C++为__int64或 long long public static long ...
- 运用Pascal来破坏DLL的一个实例
运用Pascal来破坏DLL文件的一个实例 关于Pascal静态调用和动态的调用DLL的学习您可以看Delphi/Lazarus栏目. Uses Dos; {调用DOS库} Const Root='C ...
- python学习笔记十二:类的定义
demo #!/usr/bin/python class Person: name = 'jim' age = 25 def say(self): print 'My name is ' + self ...
- flask-ssti,xss的防止
源码 import uuid from flask import Flask, request, make_response, session,render_template, url_for, re ...
- 附录:python and numpy
http://cs231n.github.io/python-numpy-tutorial/ Python is a great general-purpose programming languag ...
- ZOJ 3544 / HDU 4056 Draw a Mess( 并查集好题 )
方法参见:http://blog.acmol.com/?p=751 从最后一个线段开始倒着处理(因为之后的线段不会被它之前的线段覆盖),把这条线段所覆盖的所有线段编号合并到一个集合里,并以最左边线段编 ...
- ASP.NET 抓取网页内容
(转)ASP.NET 抓取网页内容 ASP.NET 抓取网页内容-文字 ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest. ...
- 01、JAVA开发准备
一.首先要认识几个名词: 1. JRE(Java Runtime Environment ,JAVA运行环境):它包含Java虚拟机(JVM,Java Virtual Machine)和Java程序所 ...