[Usaco2017 Jan]Promotion Counting
n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根。
问对于每个奶牛来说,它的子树中有几个能力值比它大的。
Input
n,表示有几只奶牛 n<=100000
接下来n行为1-n号奶牛的能力值pi
接下来n-1行为2-n号奶牛的经理(树中的父亲)
Output
共n行,每行输出奶牛i的下属中有几个能力值比i大
Sample Input
5
804289384
846930887
681692778
714636916
957747794
1
1
2
3
Sample Output
2
0
1
0
0
//针对所有点先分别建立权值线段树,然后进行线段树的合并
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
int n,cnt;
int pre[maxn],son[maxn],now[maxn];
int val[maxn],rt[maxn],ans[maxn],tmp[maxn]; int read()
{
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
return x*f;
} struct segment_tree
{ int tot;
int siz[maxn*20],ls[maxn*20],rs[maxn*20]; void update(int p)
{
siz[p]=siz[ls[p]]+siz[rs[p]];
} void build(int &p,int l,int r,int v)
//T.build(rt[i],1,n,val[i]);
{
if(!p)
p=++tot;
if(l==r)
{
siz[p]=1;//第p个结点的大小为1
return;
}
int mid=(l+r)>>1;
if(v<=mid)
build(ls[p],l,mid,v);
else
build(rs[p],mid+1,r,v);
update(p);
} int merge(int x,int y)
{
if(x==0||y==0)
return x+y;
ls[x]=merge(ls[x],ls[y]);
rs[x]=merge(rs[x],rs[y]);
update(x);
return x;
} int find(int p,int l,int r,int v)
{
if(p==0)
return 0;
int mid=(l+r)>>1;
if(v<=mid)
return find(ls[p],l,mid,v);
return siz[ls[p]]+find(rs[p],mid+1,r,v);
}
}T; void add(int a,int b)
{
pre[++cnt]=now[a];
now[a]=cnt,son[cnt]=b;
} int dfs(int u)
{
int root=0;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
root=T.merge(root,dfs(v));
//将以u为父亲的所有点的线段树进行合并,合并完了后再来统计
ans[u]=T.siz[root]-T.find(root,1,n,val[u]);
//用总结点个数减去小于等于val[u]的
return T.merge(root,rt[u]);
//将u与上面形成的线段树再合并 } int main()
{
n=read();
for(int i=1;i<=n;i++)
tmp[i]=val[i]=read();
sort(tmp+1,tmp+n+1);
int sum=unique(tmp+1,tmp+n+1)-tmp-1;
for(int i=1;i<=n;i++)
{
val[i]=lower_bound(tmp+1,tmp+sum+1,val[i])-tmp;
T.build(rt[i],1,n,val[i]);
//先针对每个点建立一个线段树出来
}
for(int i=2;i<=n;i++)
{
int f=read();
add(f,i);//i与其父亲f连边
}
dfs(1);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}
[Usaco2017 Jan]Promotion Counting的更多相关文章
- [BZOJ4756][Usaco2017 Jan]Promotion Counting 树状数组
4756: [Usaco2017 Jan]Promotion Counting Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 305 Solved: ...
- 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...
- 【bzoj 4756】[Usaco2017 Jan] Promotion Counting
Description The cows have once again tried to form a startup company, failing to remember from past ...
- BZOJ4756: [Usaco2017 Jan]Promotion Counting(线段树合并)
题意 题目链接 Sol 线段树合并板子题 #include<bits/stdc++.h> using namespace std; const int MAXN = 400000, SS ...
- BZOJ[Usaco2017 Jan]Promotion Counting——线段树合并
题目描述 The cows have once again tried to form a startup company, failing to remember from past experie ...
- 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
[题意]带点权树,统计每个结点子树内点权比它大的结点数. [算法]线段树合并 [题解]对每个点建权值线段树(动态开点),DFS中将自身和儿子线段树合并后统计. 注意三个量tot,cnt,tots,细心 ...
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting(线段树合并)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4756 [题目大意] 给出一棵树,对于每个节点,求其子树中比父节点大的点个数 [题解] ...
- bzoj4756 [Usaco2017 Jan]Promotion Counting
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4756 [题解] dsu on tree,树状数组直接上 O(nlog^2n) # inclu ...
- 【bzoj4756】[Usaco2017 Jan]Promotion Counting 离散化+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6832263.html 题目描述 The cows have once again tried to form a s ...
随机推荐
- 负载均衡实现,一个域名对应多个IP地址【转载】
使用负载均衡实现,传统和常规做法,其他方式需要特殊处理.(dns轮询,或者自己做解析)1.一个域名设定多个dns服务或者服务器进行解析,同一个域名的每个解析都指向不同的ip地址,这样应答快的dns优先 ...
- 状压DP操作
1.’&’符号,x&y,会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值.例如3(11)&2(10)=2(10). 2.’|’符号,x|y,会将两个十进制数在二进制 ...
- http知识总结
layout: '''http' title: 知识整理' date: 2019-06-09 17:07:20 tags: --- 简介 超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文 ...
- Python核心技术与实战——十六|Python协程
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...
- samba服务和client挂载
服务端 1.安装samba服务 yum -y install samba 2.创建系统用户 因为Samba 服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱 ...
- 图片转base64的几种场景(网络图片,本地图片,用户上传图片)
转载于博客园 https://www.cnblogs.com/zhangdiIT/p/7895903.html 写的很棒 推荐给大家 场景一:将用户本地上传的资源转化,即用户通过浏览器点击文件上传时 ...
- jvm——CMS 垃圾回收器(未完)
https://matt33.com/2018/07/28/jvm-cms/ 阶段1:Initial Mark stop-the-wolrd 标记那些直接被 GC root 引用或者被年轻代存活对象所 ...
- 那些10w+的公众号都在写什么?
出于好奇,那些10w+的公众号都写了些什么,于是我写了几个脚本爬取了各行业Top的公众号文章,进行了关键词统计. 抓取数据.分析用到了3中语言:Node.js,Java,Python.废话不多说,直接 ...
- 实战build-react(一)
https://www.jianshu.com/p/34468f13263c(copy) 目录结构 一.安装 npm install -g create-react-app 二.创建react应用 ...
- HDU 2546 饭卡(01背包)
题目代号:HDU 2546 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/ ...