首先用树状数组维护dfs序来快速支持一个点子树大小的询问。

每次删掉一个叶子时,从根开始往叶子走,显然只有$2size[x]\leq size[father]$的点的父亲才有可能换重儿子。

从根开始往下,找到最高的满足条件的点,从那个点开始继续迭代,每次点数至少减小一半,所以迭代只有$O(\log n)$次。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
const int N=200010;
int n,m,x,i,ch[N][2],size[N],f[N],d[N],son[N],top[N],st[N],en[N],q[N],dfn,bit[N];long long ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int p){for(;x<=n;x+=x&-x)bit[x]+=p;}
inline int ask(int x){int t=0;for(;x;x-=x&-x)t+=bit[x];return t;}
inline int getsize(int x){
if(!x)return 0;
return ask(en[x])-ask(st[x]-1);
}
void dfs(int x){
size[x]=1;
for(int i=0;i<2;i++){
int y=ch[x][i];
if(!y)continue;
f[y]=x;d[y]=d[x]+1;
dfs(y),size[x]+=size[y];
if(size[y]>size[son[x]])son[x]=y;
}
ans+=son[x];
}
void dfs2(int x,int y){
q[st[x]=++dfn]=x;top[x]=y;
if(son[x])dfs2(son[x],y);
for(int i=0;i<2;i++){
int o=ch[x][i];
if(!o||o==son[x])continue;
dfs2(o,o);
}
en[x]=dfn;
}
inline int up(int x,int k){
while(1){
if(st[x]-st[top[x]]>=k)return q[st[x]-k];
k-=st[x]-st[top[x]]+1;
x=f[top[x]];
}
}
inline void recal(int x){
if(!x)return;
ans-=son[x];
int t=0;
for(int i=0;i<2;i++){
int y=ch[x][i],w=getsize(y);
if(w>t)t=w;
}
if(!t)son[x]=0;
else if(getsize(son[x])!=t){
if(getsize(ch[x][0])==t)son[x]=ch[x][0];
else son[x]=ch[x][1];
}
ans+=son[x];
}
inline void remove(int x){
add(st[x],-1);
int lim=d[x],o=lim;
while(1){
int l=1,r=o,mid,t=0,s=getsize(up(x,o));
while(l<=r)if(getsize(up(x,mid=(l+r)>>1))*2<=s)l=(t=mid)+1;else r=mid-1;
recal(f[up(x,t)]);
if(!o)return;
o=t;
}
}
int main(){
while(~scanf("%d",&n)){
if(!n)return 0;
for(dfn=ans=0,i=1;i<=n;i++)size[i]=son[i]=bit[i]=0;
for(i=1;i<=n;i++)read(ch[i][0]),read(ch[i][1]);
dfs(1);
dfs2(1,1);
printf("%lld\n",ans);
for(i=1;i<=n;i++)add(i,1);
for(read(m);m--;printf("%lld\n",ans))read(x),remove(x);
}
return 0;
}

  

BZOJ4855 : [Jsoi2016]轻重路径的更多相关文章

  1. BZOJ 4855 [Jsoi2016]轻重路径

    题解:用树链剖分来维护树链剖分 令d[x]=size[heavyson[x]]-size[lightson[x]] 当d[x]<0时轻重儿子关系改变 用数据结构维护d[x]并找到这些位置改变即可 ...

  2. [JSOI2016]轻重路径[树链剖分]

    题意 题目链接 分析 先对原树树剖,在一次删点操作后从根节点开始二分,如果一条边从重边变成轻边,必然有 \(size_u\le \frac{1}{2}size_{rt}\) (取等号是特判对应儿子消失 ...

  3. 【LOJ】#2079. 「JSOI2016」轻重路径

    题解 写数据结构的时候我代码就会变得非常非常长 一看别人1.5K 2.3K 我6.3K-- orzzzzz 我们很容易想到离线倒着插入,然而,有个小锅叫如果size相同保持原来的重儿子不变 我们需要写 ...

  4. JSOI部分题解

    JSOI部分题解 JSOI2018 战争 问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb ...

  5. LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】

    题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...

  6. luogu P4719 【模板】动态 DP 矩阵乘法 + LCT

    方法二:LCT+矩阵乘法 上文中,我们用线段树来维护重链上的各种矩阵转移. 第二种方法是将树链剖分替换为动态树. 我们知道,矩阵乘法 $\begin{bmatrix} F_{u,0} & F_ ...

  7. 【GDOI2016模拟4.22】总结

    前言 早上,一进机房,发现所有人神情严肃,一股(\(da\))(\(ba\))场的气氛迎面扑来,我一下子意识到:nothing good! 这场比赛结果不是很好,50分: 第一题:感觉上是个神奇的匹配 ...

  8. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  9. Akka.net路径里的user

    因为经常买双色球,嫌每次对彩票号麻烦,于是休息的时候做了个双色球兑奖的小程序,做完了发现业务还挺复杂的,于是改DDD重做设计,拆分服务,各种折腾...,不过这和本随笔没多大关系,等差不多了再总结一下, ...

随机推荐

  1. python删除列表元素

    1.需求  num = [1,2,2,2,3,4,2,2,2,2,2,2,22,2]把列表中的有2的元素全部删除           2.编程代码 nums = [1,2,2,2,3,4,2,2,2, ...

  2. Paddington2

  3. Nginx限制下载速度

    http {   limit_conn_zone $binary_remote_addr zone=one:10m; #容器共使用10M的内存来对于IP传输开销 server {        lis ...

  4. Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#<Object>‘的解决方法

    发现问题 运行一下以前的一个Vue+webpack的 vue仿新闻网站  小项目,报错 由于自己vue学习不深入,老是这个报错,找了好久(确切的说是整整一下午^...^)才找到原因 -v- Uncau ...

  5. CentOS6.9安装socat

    yum -y install epel-release yum -y install socat

  6. Oracle Client(客户端) 安装与配置

    因为工作需要,需要通过本地oracle客户端将数据导入到远程服务器上的oracle数据库中.从csdn下了很多oracle客户端,都是属于精简版,缺少imp.exe文件,造成无法导入数据.所以最终从o ...

  7. Java基础知识➣集合整理(三)

    概述 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类) ...

  8. libsecp256k1 与 openssl ecdsa

    1. 历史 区块链节点在接收到的用户发送的交易时,首先会验证交易所涉及utxo的可用性.方法是验证用户签名的合法性,涉及的签名算法就是secp256k1,一种椭圆曲线加密算法. 长期以来,实现了该算法 ...

  9. Migrating your code from 9.3 to 10.x

    刚发现ArcGIS Objects SDK提供了一个代码升级分析工具,用于辅助将程序从9.3升级到10.X:ArcGIS Code Migration Analyzer. 安装sdk后,在vs2010 ...

  10. shell界面执行mysql命令

    mysql -uroot -poRcl_123 -Dsnsdb_test -e "select host from user;"