cf860E Arkady and A Nobody-men (树剖)
容易得出,如果我们按照深度一层一层地做,做完一层后,这层某个点的答案就是它的祖先们的子树大小(统计大小时不包括树根)
由于我太菜了不会别的方法,虽然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 (树剖)的更多相关文章
- CF860E Arkady and a Nobody-men
CF860E Arkady and a Nobody-men 类比LNOI2014 LCA那个题,其实树剖可以过....(用树状数组区间加区间求和更快!) 巧妙的nlogn做法是: blog~ (其实 ...
- 【61测试】【dp】【二分】【前缀和】【树剖】
不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...
- hdu_5221_Occupation(树剖)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5221 题意:给你一棵树,每个节点有一定的值,有三种操作: 1 x y 表示占领树上x-y的所有节点,2 ...
- 【树链剖分】洛谷P3384树剖模板
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】
题目链接: TP 题解: 可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...
- BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...
- BZOJ_3626_[LNOI2014]LCA_离线+树剖
BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度, ...
- BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
随机推荐
- synchronized和Lock的异同
JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...
- P4099 [HEOI2013]SAO
P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...
- C# 时间戳与DateTime互转
#region 转换时间为unix时间戳 /// <summary> /// 转换时间为unix时间戳 /// </summary> /// <param name=&q ...
- 你真的了解volatile关键字吗?
volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性,但是关于volatile的使用仍然要小心,这需要明白volatile关键字的特性及实现的原理,这也是本篇文章的主要内容. 一. ...
- mysql下批量清空某个库下的所有表(库不要删除,保留空库)
总所周知,mysql下要想删除某个库下的某张表,只需要切换到该库下,执行语句"drop table tablename"即可删除!但若是该库下有成百上千张表,要是再这样一次次执行d ...
- Python常见字符编码间的转换
主要内容: 1.Unicode 和 UTF-8的爱恨纠葛 2.字符在硬盘上的存储 3.编码的转换 4.验证编码是否转换正确 5.Python bytes类型 前 ...
- sql-server安装
ubuntu安装sql-server https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-ubuntu?view ...
- 总结and规划
不知不觉中又过去了一年,马上就要读研究生了,因此有必要对自己进行必要的总结,以及对自己有个良好的规划. 首先,描述自己当前的心情——对未来充满了恐惧和焦虑. 马上大学就要毕业了,回首经历的大学生涯,似 ...
- 【BUAA软件工程】第一次阅读作业
BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...
- linux及安全第五周总结
给MenuOS增加time和time-asm命令 中间过程已省略了,我们所做的只是将menu更新 具体命令如下 rm menu -rf 强制删除 git clone http://github.com ...