BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组

时间:2022-09-21 09:13:33

BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组

Description

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
 

这道题的思路比较巧妙。
我们对整棵树进行DFS时每个点有两次处理的机会。
一次是刚刚遍历到,一次是子树的回溯。
分别求出两次能力值大于这个点的点的个数,用第二次的减去第一次的就是这个点的答案。
然后离散用树状数组处理一下。
 
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
struct A {
int num,id,v;
}a[N];
bool cmp1(const A &x,const A &y){return x.num>y.num; }
bool cmp2(const A &x,const A &y){return x.id<y.id; }
int n,head[N],to[N<<1],nxt[N<<1],cnt,ans[N],c[N];
inline void add(int u,int v) {
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void fix(int x,int v) {
for(;x<=n;x+=x&-x) c[x]+=v;
}
int inq(int x) {
int re=0;
for(;x;x-=x&-x) re+=c[x];
return re;
}
void dfs(int x,int y) {
int i;
fix(a[x].v,1);
int tmp=inq(a[x].v-1);
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y) {
dfs(to[i],x);
}
}
ans[x]=inq(a[x].v-1)-tmp;
}
int main() {
//freopen("tt.in","r",stdin);
scanf("%d",&n);
int i,x,j;
for(i=1;i<=n;i++) scanf("%d",&a[i].num),a[i].id=i;
sort(a+1,a+n+1,cmp1); a[0].num=-245345;
for(i=1,j=0;i<=n;i++) { if(a[i].num!=a[i-1].num) j++; a[i].v=j; }
sort(a+1,a+n+1,cmp2);
for(i=2;i<=n;i++) {
scanf("%d",&x);
add(i,x); add(x,i);
}
dfs(1,0);
for(i=1;i<=n;i++) printf("%d\n",ans[i]);
}

BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组的更多相关文章

  1. &lbrack;BZOJ4756&rsqb;&lbrack;Usaco2017 Jan&rsqb;Promotion Counting 树状数组

    4756: [Usaco2017 Jan]Promotion Counting Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 305  Solved: ...

  2. 线段树合并 &vert;&vert; 树状数组 &vert;&vert; 离散化 &vert;&vert; BZOJ 4756&colon; &lbrack;Usaco2017 Jan&rsqb;Promotion Counting &vert;&vert; Luogu P3605 &lbrack;USACO17JAN&rsqb;Promotion Counting晋升者计数

    题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...

  3. 【bzoj4756】&lbrack;Usaco2017 Jan&rsqb;Promotion Counting 离散化&plus;树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832263.html 题目描述 The cows have once again tried to form a s ...

  4. bzoj 4756&colon; &lbrack;Usaco2017 Jan&rsqb;Promotion Counting【dfs&plus;树状数组】

    思路还是挺好玩的 首先简单粗暴的想法是dfs然后用离散化权值树状数组维护,但是这样有个问题就是这个全局的权值树状数组里并不一定都是当前点子树里的 第一反应是改树状数组,但是显然不太现实,但是可以这样想 ...

  5. 树状数组 P3605 &lbrack;USACO17JAN&rsqb;Promotion Counting晋升者计数

    P3605 [USACO17JAN]Promotion Counting晋升者计数 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 ...

  6. &lbrack;bzoj4994&rsqb;&lbrack;Usaco2017 Feb&rsqb;Why Did the Cow Cross the Road III&lowbar;树状数组

    Why Did the Cow Cross the Road III bzoj-4994 Usaco-2017 Feb 题目大意:给定一个长度为$2n$的序列,$1$~$n$个出现过两次,$i$第一次 ...

  7. BZOJ4994 &lbrack;Usaco2017 Feb&rsqb;Why Did the Cow Cross the Road III 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4994 题意概括 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi ...

  8. BZOJ4990 &lbrack;Usaco2017 Feb&rsqb;Why Did the Cow Cross the Road II 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...

  9. BZOJ4993 &lbrack;Usaco2017 Feb&rsqb;Why Did the Cow Cross the Road II 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4993 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...

随机推荐

  1. CSS3实现加载中效果

    代码: <!doctype html> <html> <head> <meta charset="utf-8" /> <tit ...

  2. DP~青蛙过河(hrbust1186&rpar;

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxoAAAKlCAYAAABMq5pGAAAgAElEQVR4nOzdf4xl53nY9/mrQP8r+k

  3. linux自动备份文件和数据库并上传到指定的远程FTP中

    直接把以下脚本复制到/root/backup.sh[root@lvtao.net ~]# chmod +x /root/backup.sh[root@lvtao.net ~]# crontab -e0 ...

  4. 线性代数(高斯消元):JSOI2008 球形空间产生器sphere

    JSOI2008 球形空间产生器sphere [题目描述] 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确 ...

  5. Javascript Array Distinct &lpar;array&period;reduce实现&rpar;

    javascript 没有原生的Distinct功能 . (至少现在还没有)但我们可以通过简单的script 自己实现 . Distinct就是把数组中重复出现2次或以上的值给删除掉,确保数组内每个值 ...

  6. LINUX修改IP地址

    以前都是使用自动IP动态分配获取IP的,虽然每次获得的ip都是相同的,但我还是决定自己设置一个IP.输入命令:[root@localhost ~]# ifconfig eth0 219.246.177 ...

  7. Linux基本命令之用户系统相关命令

    1.格式说明 [simon@localhost simon]$ [simon@localhost ~]$ 这两种方式表示相同.simon是指定用户,localhost是计算机名字,如果不设置默认为lo ...

  8. POJ2891 Strange Way to Express Integers &lbrack;中国剩余定理&rsqb;

    不互质情况的模板题 注意多组数据不要一发现不合法就退出 #include <iostream> #include <cstdio> #include <cstring&g ...

  9. Ext&period;define&lpar;override&rpar;

    Ext.define(override)作用是:定义类的补丁(扩展或重写) 有3中使用方法,见附件 Ext.define(override).zip

  10. leetcode338

    public class Solution { public int[] CountBits(int num) { ]; ; i <= num; i++) { ; var cur = i; do ...