思路

线段树合并的板子。。
和子节点合并之后在值域线段树上查询即可

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 1000100;
int n,Nodecnt,root[MAXN],u[MAXN<<1],v[MAXN<<1],cnt,fir[MAXN],nxt[MAXN<<1],ans[MAXN],ax[MAXN],w_p[MAXN],nx;
struct Node{int lson,rson,sz;
}Seg[MAXN<<2];
int merge(int x,int y,int l,int r){if(x*y==0)return x+y;if(l==r){int t=++Nodecnt;Seg[t].sz=Seg[x].sz+Seg[y].sz;return Nodecnt;}int g=++Nodecnt;Seg[g].sz=Seg[x].sz+Seg[y].sz;int mid=(l+r)>>1;Seg[g].lson=merge(Seg[x].lson,Seg[y].lson,l,mid);Seg[g].rson=merge(Seg[x].rson,Seg[y].rson,mid+1,r); return g;
}
int query(int l,int r,int o,int val){if(l==r){return 0;  }int mid=(l+r)>>1;if(val<=mid)return query(l,mid,Seg[o].lson,val)+Seg[Seg[o].rson].sz;elsereturn query(mid+1,r,Seg[o].rson,val);
}
void build(int l,int r,int &o,int val){if(!o)o=++Nodecnt;Seg[o].sz++;if(l==r)return;int mid=(l+r)>>1;if(val<=mid)build(l,mid,Seg[o].lson,val);elsebuild(mid+1,r,Seg[o].rson,val);
}
void addedge(int ui,int vi){++cnt;u[cnt]=ui;v[cnt]=vi;nxt[cnt]=fir[ui];fir[ui]=cnt;
}
void dfs(int u,int fa){for(int i=fir[u];i;i=nxt[i]){if(v[i]==fa)continue;dfs(v[i],u);root[u]=merge(root[v[i]],root[u],1,n);}ans[u]=query(1,n,root[u],w_p[u]);
}
void init(void){sort(ax+1,ax+n+1);nx=unique(ax+1,ax+n+1)-ax-1;
//  printf("%d\n",nx);for(int i=1;i<=n;i++){w_p[i]=lower_bound(ax+1,ax+nx+1,w_p[i])-ax;
//      printf("%d!\n",w_p[i]);} for(int i=1;i<=n;i++){build(1,n,root[i],w_p[i]);}
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&w_p[i]),ax[i]=w_p[i];}for(int i=2;i<=n;i++){int x;scanf("%d",&x);addedge(i,x);addedge(x,i);}init();dfs(1,0);for(int i=1;i<=n;i++)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10555166.html

P3605 [USACO17JAN]Promotion Counting晋升者计数相关推荐

  1. P3605 [USACO17JAN]Promotion Counting P dfs序

    传送门 文章目录 题意: 思路: 题意: 思路: 这个题可以用各种姿势a掉,树启和线段树合并都可以,比较无脑.下面给一个解决这种问题比较巧妙的做法. 考虑暴力怎么写,我们先将每个点的权值离散化一下,每 ...

  2. P3605 [USACO17JAN]Promotion Counting P(树状数组)

    解析 做法很多的一道题 sol1 先求出dfs序,离线下来,然后按权值大小的顺序统计答案并插到对应的dfs序中 sol2 离散化后,dfs过程中动态维护树状数组,利用前后差值求出答案 sol3 树上d ...

  3. [USACO17JAN]Promotion Counting 题解

    前言 巨佬说:要有线段树,结果蒟蒻打了一棵树状数组... 想想啊,奶牛都开公司当老板了,我还在这里码代码,太失败了. 话说奶牛开个公司老板不应该是FarmerJohn吗? 题解 刚看到这道题的时候竟然 ...

  4. Promotion Counting【USACO 2016 January Contest, Bronze】

    今天来分享一下我做过的几道Usaco的比较简单的题,Usaco是美国的一个c++竞赛比赛,但是全球各地的人都可以参加,Usaco没有监考,全凭诚信,但是你拿着这个 作弊 借鉴来的成绩,所有美国的大学都 ...

  5. [BZOJ4756] [Usaco2017 Jan]Promotion Counting(线段树合并)

    传送门 此题很有意思,有多种解法 1.用天天爱跑步的方法,进入子树的时候ans-query,出去子树的时候ans+query,query可以用树状数组或线段树来搞 2.按dfs序建立主席树 3.线段树 ...

  6. 洛谷3605 Promotion Counting

    线段树合并都是蓝题了嘛 我可能和时代脱轨了emm... 直接离散化然后合并就好啦w 生病了真难受QAQ //Love and Freedom. #include<cstdio> #incl ...

  7. [BZOJ4756]Promotion Counting

    Description The cows have once again tried to form a startup company, failing to remember from past ...

  8. 牛客假日团队赛1 D.Promotion Counting

    链接: https://ac.nowcoder.com/acm/contest/918/D 题意: Bessie the cow is helping Farmer John run the USA ...

  9. Lake Counting(湖泊计数)

    今天做了一个挺有趣的问题,下面我将叙述并给出结题代码 #include<bits/stdc++.h>using namespace std;char a[101][101]; int n, ...

最新文章

  1. ICMP 隧道——将流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测...
  2. 掉网问题的log分析
  3. C语言十六进制转换为八进制(附完整源码)
  4. [转]粵語固有辭彙與漢語北方話辭彙對照
  5. 利用python进行数据分析_利用python进行数据分析复现(1)
  6. SQLServer引擎优化顾问
  7. 每日一道算法题--leetcode 169--求众数--python--两种方法
  8. pl/sql远程连接oracle总结
  9. zookeeper分布式协调服务的使用一
  10. mysql目录结构与源码
  11. 纯Css比较好看的中英文字体样式(持续整理版)
  12. kubeedge v1.1.0部署指南
  13. Golang Hotfix技术背景
  14. 树莓派控制PCF8591 AD/DA模块
  15. python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数
  16. CORBA 架构体系指南(通用对象请求代理体系架构)​
  17. 计算机管理器自动弹出,win7打开IE浏览器自动弹出管理加载项窗口解决方法
  18. 计算机在职研究生的详细介绍
  19. 计算机网络是计算机科学技术和结合的产物,计算机网络是计算机技术和什么
  20. Python爬虫——Cookie模拟登录

热门文章

  1. Ubuntu10 上安装Vmware Tools注意
  2. C中printf函数的实现原理
  3. linux内核网络协议栈--数据包的发送过程(二十一)
  4. 20164317《网络对抗技术》Exp9 Web安全基础
  5. Linux01-企业核心技术之逻辑卷LVM原理深入讲解35
  6. linux下基于apache下的svn的搭建
  7. 继承机制中的构造器和析构器 - C++快速入门17
  8. (译)如何使用box2d来做碰撞检测(且仅用来做碰撞检测)
  9. 函数 —— memset(给数组重新赋值,用指定字符替换数组中的部分值)
  10. php 提交网页 传值 获取编辑框的值