[USACO17JAN]Promotion Counting
线段树合并。
正解好像不是线段树合并,但是出于练手的目的写了线段树合并。
大概就是对于左右子树,如果有一个为空,返回非空的,如果都不为空,就把这两个整合到一起就行了。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=100005;
int tot,ls[N<<5],rs[N<<5],siz[N<<5],n,p[N],head[N],ecnt,lsh[N],LSH,ans[N],rt[N];
struct Edge{int to,nxt;}e[N<<1];
void add(int bg,int ed){e[++ecnt].to=ed;e[ecnt].nxt=head[bg];head[bg]=ecnt;}
void pushup(int x) {siz[x]=siz[ls[x]]+siz[rs[x]];}
void update(int &k,int l,int r,int val) {
if(!k)k=++tot;int mid=l+r>>1;
if(l==r) {siz[k]++;return;}
if(val<=mid) update(ls[k],l,mid,val);
else update(rs[k],mid+1,r,val);
pushup(k);
}
int query(int ql,int qr,int l,int r,int cur) {
int mid=l+r>>1;
if(ql<=l&&r<=qr) return siz[cur];
int sum=0;
if(ql<=mid) sum+=query(ql,qr,l,mid,ls[cur]);
if(qr>mid) sum+=query(ql,qr,mid+1,r,rs[cur]);
return sum;
}
int merge(int u,int v) {
if(u*v==0) return u+v;
ls[u]=merge(ls[u],ls[v]);
rs[u]=merge(rs[u],rs[v]);
pushup(u);
return u;
}
void dfs(int x,int fa) {
for(int i=head[x];i;i=e[i].nxt) {
int v=e[i].to;
if(v==fa) continue;
dfs(v,x);
rt[x]=merge(rt[x],rt[v]);
}
ans[x]=query(p[x]+1,n,1,n,rt[x]);
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&p[i]),lsh[++LSH]=p[i];
sort(lsh+1,lsh+1+LSH);
int u=unique(lsh+1,lsh+1+LSH)-lsh-1;
for(int i=1;i<=n;i++) p[i]=lower_bound(lsh+1,lsh+1+u,p[i])-lsh;
for(int i=2,fa;i<=n;i++) scanf("%d",&fa),add(i,fa),add(fa,i);
for(int i=1;i<=n;i++) update(rt[i],1,n,p[i]);
dfs(1,0);for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}
[USACO17JAN]Promotion Counting的更多相关文章
- Luogu3605 [USACO17JAN]Promotion Counting晋升者计数
Luogu3605 [USACO17JAN]Promotion Counting晋升者计数 给一棵 \(n\) 个点的树,点 \(i\) 有一个权值 \(a_i\) .对于每个 \(i\) ,求 \( ...
- 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...
- 树状数组 P3605 [USACO17JAN]Promotion Counting晋升者计数
P3605 [USACO17JAN]Promotion Counting晋升者计数 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 ...
- 洛谷P3605 [USACO17JAN] Promotion Counting 晋升者计数 [线段树合并]
题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...
- [USACO17JAN]Promotion Counting晋升者计数
题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1 \cdots N(1 \leq N \leq 100, 000)1⋯N(1≤N ...
- luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
题目链接 luogu 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并... 看代码吧 错误 和写主席树错的差不多 都是变量写错.... 代码 #include <bits ...
- P3605 [USACO17JAN]Promotion Counting晋升者计数
思路 线段树合并的板子.. 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include < ...
- BZOJ4756 [USACO17JAN]Promotion Counting晋升者计数
Description The cows have once again tried to form a startup company, failing to remember from past ...
- [USACO17JAN] Promotion Counting晋升者计数 (树状数组+dfs)
题目大意:给你一棵树,求以某节点为根的子树中,权值大于该节点权值的节点数 本题考查dfs的性质 离散+树状数组求逆序对 先离散 我们发现,求逆序对时,某节点的兄弟节点会干扰答案 所以,我们在递推时统计 ...
随机推荐
- 【ACM】poj_3981_字符串替换_201307271019
字符串替换Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8447 Accepted: 3988 Description 编写 ...
- c#--早绑定晚绑定
原文地址 早绑定early binding: 在编译的时候就已经却确定了将来程序运行基类或者派生类的哪个方法. 在编译代码的时候根据引用类型就决定了运行该引用类型中定义的方法.即基类方法. 这种方式运 ...
- codevs——T1267 老鼠的旅行
http://codevs.cn/problem/1267/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- Embedded Android 协同翻译
假设你有一定的Android的基础和英语基础. 有愿意贡献开源社区的心. 假设你对下面文件夹感兴趣, 欢迎增加我们协同翻译<Embedded Android> 此次协同翻译.将使用gith ...
- Ajax的两种实现方式
//ajax的jquery实现 function aclick(){//alert("測试一");var name = $("#userName").val() ...
- MEAN框架介绍
近期在Angular社区的原型开发人员间.一种全Javascript的开发架构MEAN正突然流行起来.其首字母分别代表的是:(M)ongoDB--NoSQL的文档数据库,使用JSON风格来存储数据,甚 ...
- PHP之实现双向链表(代码篇)
<?php/** * PHP之实现双向链表 */class Hero{ public $pre=null; public $no; public $name; public $next=null ...
- PHP统计所有字符在字符串中出现的次数
<?php //统计字符串中出现的字符,出现次数 echo '<pre>'; $str = 'aaabbccqqwweedfghhjffffffffggggggggg';//字符串示 ...
- jstl 标签 循环 序号
大家好: 今天搜了一天.最终找到它了,尽管不是我想要的,可是为了我辛苦的一天.我也要记录下: <c:forEach items="${signBusList}" var ...
- luogu1965 转圈游戏
题目大意 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,--,依此 ...