容易得出,如果我们按照深度一层一层地做,做完一层后,这层某个点的答案就是它的祖先们的子树大小(统计大小时不包括树根)

由于我太菜了不会别的方法,虽然N是5e5的,还是只好用一个树剖(树状数组降常数)水过去了

就是统计到某个点的时候把它的父亲到根+1

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int dfn[maxn],id[maxn],tot,fa[maxn],dep[maxn],top[maxn],bot[maxn];
ll tr[maxn],itr[maxn],ans[maxn];
int eg[maxn][],egh[maxn],ect,N,wson[maxn],siz[maxn];
int bfn[maxn],qt,qh,root; inline void adeg(int a,int b){
eg[++ect][]=b,eg[ect][]=egh[a];egh[a]=ect;
} void dfs1(int x){
// printf("!%d %d\n",x,fa[x]);
siz[x]=;int mm=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];
dep[b]=dep[x]+;dfs1(b);
if(mm<siz[b]) mm=siz[b],wson[x]=b;
siz[x]+=siz[b];
}
} void dfs2(int x){
dfn[x]=++tot,id[tot]=x;
top[x]=(x==wson[fa[x]])?top[fa[x]]:x;
if(wson[x]) dfs2(wson[x]);
else bot[top[x]]=x;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];
if(b==wson[x]) continue;
dfs2(b);
}
} inline int lowbit(int x){return x&(-x);}
inline void add(int tp,int bt,int x,int y){
x-=tp;ll iy=y*x;
for(;x<=bt-tp;x+=lowbit(x)) tr[x+tp]+=y,itr[x+tp]+=iy;
}
inline ll query(int tp,int x){
ll re=;x-=tp;int n=x;
for(;x;x-=lowbit(x)) re+=(n+)*tr[x+tp]-itr[x+tp];
return re;
} inline void tradd(int x){
while(x){
add(dfn[top[x]]-,dfn[bot[top[x]]],dfn[top[x]],);
add(dfn[top[x]]-,dfn[bot[top[x]]],dfn[x]+,-);
x=fa[top[x]];
}
}
inline ll trque(int x){
ll re=;
while(x){
// printf("!%d %d %d\n",dfn[x],dfn[top[x]],dfn[bot[top[x]]]);
re+=query(dfn[top[x]]-,dfn[x]);
x=fa[top[x]];
}return re;
} inline void bfs(){
bfn[qh=qt=]=root;
while(qh<=qt){
int p=bfn[qh++];
for(int i=egh[p];i;i=eg[i][]){
// printf("%d %d\n",i,eg[i][0]);
bfn[++qt]=eg[i][];
}
}
int lst=;
for(int i=;i<=qt;i++){
for(;dep[bfn[lst]]!=dep[bfn[i]];lst++)
ans[bfn[lst]]=trque(fa[bfn[lst]]);
tradd(fa[bfn[i]]);
}
for(;lst<=qt;lst++)
ans[bfn[lst]]=trque(fa[bfn[lst]]);
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
for(i=;i<=N;i++){
fa[i]=rd();
if(fa[i]) adeg(fa[i],i);
else root=i;
}
dep[]=root;dfs1(root);dfs2(root);
bfs();
for(i=;i<=N;i++)
printf("%I64d ",ans[i]);
return ;
}

cf860E Arkady and A Nobody-men (树剖)的更多相关文章

  1. CF860E Arkady and a Nobody-men

    CF860E Arkady and a Nobody-men 类比LNOI2014 LCA那个题,其实树剖可以过....(用树状数组区间加区间求和更快!) 巧妙的nlogn做法是: blog~ (其实 ...

  2. 【61测试】【dp】【二分】【前缀和】【树剖】

    不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...

  3. hdu_5221_Occupation(树剖)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5221 题意:给你一棵树,每个节点有一定的值,有三种操作: 1 x y 表示占领树上x-y的所有节点,2 ...

  4. 【树链剖分】洛谷P3384树剖模板

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  5. 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】

    题目链接: TP 题解:   可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...

  6. BZOJ_2238_Mst_树剖+线段树

    BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...

  7. BZOJ_3626_[LNOI2014]LCA_离线+树剖

    BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度, ...

  8. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

  9. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

随机推荐

  1. @Pointcut的用法

    在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature).让我们先看看execution表示式的格式: ...

  2. Linux下DNS服务(Bind9)之Web管理利器-NamedManager部署说明

    NamedManager 是一个基于Web的DNS管理系统,可用来添加.调整和删除DNS的zones/records数据.它使用Bind作为底层DNS服务,提供一个现代Ajax的Web界面,支持 IP ...

  3. Mesos+Zookeeper+Marathon的Docker管理平台部署记录(2)- 负载均衡marathon-lb

    之前介绍了Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)的操作,多余的废话不说了,下面接着说下在该集群环境下的负载均衡marathon-lb的部署过程: 默认情况 ...

  4. 对象&内置对象& 对象构造 &JSON&__proto__和prototype

    原型是一个对象,其他对象可以通过它实现属性继承 原型链:每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__pro ...

  5. Opentsdb分布式安装

    Opentsdb分布式安装 --李琦 1.下载文件上传到虚拟机 -rw-r--r--.  1 root   root  76793860 Apr 27 10:56 opentsdb-2.2.0.tar ...

  6. DWR实现服务器向客户端推送消息

    原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研 ...

  7. package.json中的几种依赖注册对象解析

    本博文根据官网+google翻译+自己的理解,欢迎指出翻译的不到位的地方. package.json的重要性不言而喻,一直以来对几种依赖注册对象的区别和作用不是很了解,今日一探究竟. dependen ...

  8. wamp升级php5.3.10到5.4.31版本

    wamp升级php5.3.10到5.4.31版本 1.  停止WAMP服务器. 2.  去网站windows.php.net 下载php-5.4.31-nts-Win32-VC9-x86.zip. 不 ...

  9. [转帖]Asp.Net MVC EF各版本区别

    Asp.Net MVC EF各版本区别 https://www.cnblogs.com/liangxiaofeng/p/5840754.html 2009年發行ASP.NET MVC 1.0版 201 ...

  10. msyql sql语句收集

    在不断的学习中,发现了一些新的slq语句,总结于此. 一.复制数据表的sql 1)create table tableName  as  select  * from   tableName2     ...