P3605 [USACO17JAN]Promotion Counting晋升者计数
思路
线段树合并的板子。。
和子节点合并之后在值域线段树上查询即可
代码
#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;
	else
		return 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);
	else
		build(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;
}
P3605 [USACO17JAN]Promotion Counting晋升者计数的更多相关文章
- 线段树合并 || 树状数组 || 离散化 || 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 ... 
- 洛谷 P3605 [USACO17JAN]Promotion Counting晋升者计数
		题目描述 The cows have once again tried to form a startup company, failing to remember from past experie ... 
- luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
		题目链接 luogu 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并... 看代码吧 错误 和写主席树错的差不多 都是变量写错.... 代码 #include <bits ... 
- Luogu3605 [USACO17JAN]Promotion Counting晋升者计数
		Luogu3605 [USACO17JAN]Promotion Counting晋升者计数 给一棵 \(n\) 个点的树,点 \(i\) 有一个权值 \(a_i\) .对于每个 \(i\) ,求 \( ... 
- 题解 P3605 【[USACO17JAN]Promotion Counting晋升者计数】
		这道题开10倍左右一直MLE+RE,然后尝试着开了20倍就A了...窒息 对于这道题目,我们考虑使用线段树合并来做. 所谓线段树合并,就是把结构相同的线段树上的节点的信息合在一起,合并的方式比较类似左 ... 
- [USACO17JAN]Promotion Counting晋升者计数
		题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1 \cdots N(1 \leq N \leq 100, 000)1⋯N(1≤N ... 
- BZOJ4756 [USACO17JAN]Promotion Counting晋升者计数
		Description The cows have once again tried to form a startup company, failing to remember from past ... 
随机推荐
- hdu5439 二分
			题意 初始给了 1 2 两个数 第二步 因为第2个数是2 所以 在序列后面放上2个2 包括他自己之前有的 序列变成 1 2 2 第三步 因为第3个数是2 所以 在序列后面放上2个3 就变成了 1 ... 
- uva 1416 Warfare And Logistics
			题意: 给出一个无向图,定义这个无向图的花费是 其中path(i,j),是i到j的最短路. 去掉其中一条边之后,花费为c’,问c’ – c的最大值,输出c和c’. 思路: 枚举每条边,每次把这条边去掉 ... 
- SLAM学习笔记 - 视觉SLAM方法资源汇总
			工具类: ros框架 linux系列教程 vim Eigen Eigen快速入门 Pangolin Pangolin安装与使用 数据集: TUM 数据格式 提供pyt ... 
- JS实战
			1. jquery取消点击事件 $("#dashboard").unbind("click"); 2.jquery绑定鼠标滑过,离开事件 $("#da ... 
- 【swiper轮播插件】解决swiper轮播插件触控屏问题
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- OAuth2.0 知多少(好)
			https://www.cnblogs.com/sheng-jie/p/6564520.html 简书集成的社交登录,大大简化了我们的注册登录流程,真是一号在手上网无忧啊.这看似简单的集成,但背后的技 ... 
- linux dns
			linux 用户相关的 root 相当于QQ群主 sudo QQ群管理员 普通用户 QQ群水军 root UID 是 0 组UID也是0 普通用户UID从1000开始 查看用户id 信 ... 
- Ajax  知识
			Ajax 为什么要有ajax技术? 传统的web应用,一个简单的操作就要加载整个页面.浪费资源. Ajax 即“Asynchronous Javascript And XML”(异步JavaS ... 
- [转载]Oracle左连接、右连接、全外连接以及(+)号用法
			Oracle 外连接(OUTER JOIN) 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUTER JO ... 
- 记账本微信小程序开发二
			新建一个微信小程序项目 熟悉软件各种操作. 
