E. Xenia and Tree 解析(思維、重心剖分)
Codeforce 342 E. Xenia and Tree 解析(思維、重心剖分)
今天我們來看看CF342E
題目連結
題目
給你一棵樹,有兩種操作,把某點標成紅色或者查詢離某點最近的紅點有多遠。
前言
這題我是當作學習重心剖分的習題看待的,最詳細的版本請看教學文

想法
每兩個樹上的點,其重心剖分樹(CD樹)上的\(LCA\)一定在其最短路徑上。因此當我們把點\(v\)塗成紅色時,我們只需要更改CD樹上\(v\)的祖先到最近的紅點的距離就好。
令\(ans[v]\)代表\(v\)子樹(CD樹上的子樹)上到離\(v\)最近的紅點的距離。假設把\(v\)塗色,\(j\)為\(v\)在CD樹上的某個祖先,\(ans[j]=min(ans[j],dist(v,j))\),\(dist(v,j)\)代表在原圖上\(v,j\)間的最短距離,我們可以用老方法:\(dist(v,j)=dep[v]+dep[j]-2\times dep[lca(v,j)]\),\(dep[v]\)是\(v\)在原圖的深度。
而要搜尋離\(v\)最近的紅點距離時,由於兩點間的最短距離上一定有CD樹上\(v\)的祖先,因此我們遍歷那些祖先(點\(j\)),找\(dist(v,j)+ans[j]\)的最小值。
程式碼:
const int _n=1e5+10;
int t,n,m,aa,bb,vv,ans[_n];
VI G[_n];
int sz[_n],cd_fa[_n];
bool del[_n];
void dfsSz(int v,int faa){
sz[v]=1;
rep(i,0,SZ(G[v]))if(G[v][i]!=faa and !del[G[v][i]])dfsSz(G[v][i],v),sz[v]+=sz[G[v][i]];
}
int get_centroid(int v,int faa,int cnt){
rep(i,0,SZ(G[v]))if(G[v][i]!=faa and !del[G[v][i]] and sz[G[v][i]]>cnt/2)
return get_centroid(G[v][i],v,cnt);
return v;
}
void centroid_decomposition(int v,int faa){
dfsSz(v,faa);int centroid=get_centroid(v,faa,sz[v]);
cd_fa[centroid]=faa,del[centroid]=1;
rep(i,0,SZ(G[centroid]))if(G[centroid][i]!=faa and !del[G[centroid][i]])
centroid_decomposition(G[centroid][i],centroid);
}
const int MAXB=18;
int dep[_n],fa[_n][MAXB];
void dfs(int v,int faa,int d){
dep[v]=d;fa[v][0]=faa;
rep(i,0,SZ(G[v]))if(faa!=G[v][i])dfs(G[v][i],v,d+1);
}
void bfa(){
rep(j,1,MAXB)rep(i,1,n+1)if(~fa[i][j-1])
fa[i][j]=fa[fa[i][j-1]][j-1];
}
int lca(int a,int b){
if(dep[a]<dep[b])swap(a,b);
per(j,0,MAXB)if(~fa[a][j] and dep[fa[a][j]]>=dep[b])a=fa[a][j];
if(a==b)return a;
per(j,0,MAXB)if(~fa[a][j] and fa[a][j]!=fa[b][j])a=fa[a][j],b=fa[b][j];
return fa[a][0];
}
void update(int vv){
int b=vv;
while(b!=-1){
int l=lca(vv,b);
ans[b]=min(ans[b],dep[vv]+dep[b]-2*dep[l]);
b=cd_fa[b];
}
}
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;rep(i,0,n-1){cin>>aa>>bb;G[aa].pb(bb),G[bb].pb(aa);}
dfs(1,-1,0);rep(i,1,n+1)rep(j,1,MAXB)fa[i][j]=-1; bfa();
centroid_decomposition(1,-1);rep(i,1,n+1)ans[i]=1e5;
update(1);
while(m--){
cin>>t>>vv;
if(t==1)update(vv);
else{
int minn=1e9,b=vv;
while(b!=-1){
int l=lca(vv,b);
minn=min(minn,ans[b]+dep[b]+dep[vv]-2*dep[l]);
b=cd_fa[b];
}cout<<minn<<'\n';
}
}
return 0;
}
標頭、模板請點Submission看
Submission
E. Xenia and Tree 解析(思維、重心剖分)的更多相关文章
- D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)
Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...
- B. Kay and Snowflake 解析(思維、DFS、DP、重心)
Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...
- E. Tree Queries 解析(思維、LCA)
Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...
- E. Tree Reconstruction 解析(思維)
Codeforce 1041 E. Tree Reconstruction 解析(思維) 今天我們來看看CF1041E 題目連結 題目 略,請直接看原題 前言 一開始完全搞錯題目意思,還以為每次會刪除 ...
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
- B. Two Arrays 解析(思維)
Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...
随机推荐
- 轻轻松松学CSS:overflow
一.overflow的定义 overflow,音[əʊvəˈfləʊ],义[溢出],就像2.2米的人躺在1.8米的床上,腿得耷拉到床外一样.overflow 属性用于控制内容溢出容器时显示的方式 二. ...
- 什么是 Opcache,如何使用 Opcache
Opcode 是啥? 我们先看一下 PHP 的执行过程: PHP 初始化执行环节,启动 Zend 引擎,加载注册的扩展模块. 初始化后读取 PHP 脚本文件,Zend 引擎对 PHP 文件进行词法分析 ...
- 详解如何使用koa实现socket.io官网的例子
socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下利用 socket.io 实现消息实时推送 框架准备 1.确保你本地已经安装好了nodejs和np ...
- synchronized 锁的升级
synchronized 的基本认识 在多线程并发编程中 synchronized 一直是元老级角色,很 多人都会称呼它为重量级锁.但是,随着 Java SE 1.6 对 synchronized 进 ...
- Spring学习(一)--Spring的设计与整体架构
之前只是在学校里大概的学习了一下Spring框架的使用以及一些最基本.浅显的原理,并没有做出深入的学习,等到工作之后想提升自己的时候发现所掌握的Spring框架的简直烂如狗屎,为监督自己的学习进度,立 ...
- 利用mindmaster思维导图学好Python
- 山寨一个Spring的@Component注解
1. 前言 我们在上一篇对Mybatis如何将Mapper接口注入Spring IoC进行了分析,有同学问胖哥这个有什么用,这个作用其实挺大的,比如让你实现一个类似@Controller的注解(或者继 ...
- 【题解】[国家集训队]happiness
题目戳我 \(\text{Solution:}\) 显然还是一个分组问题.对于理科和文科我们可以看出最小割模型,而处理同时选择某一学科的时候,需要我们根据套路建立虚点处理. 同 小M的作物 一题,这题 ...
- 【题解】[ZJOI2009]狼和羊的故事
题目戳我 \(\text{Solution:}\) 显然思路,把所有羊看成一个源点,所有狼看成一个汇点,格子之间连容量为\(1\)的边,直接跑最小割. 技巧: 注意到篱笆不能把羊给割掉,狼同理.所以, ...
- LiteOS-任务篇-源码分析-系统启动函数
目录 前言 链接 参考 开启调度 LOS_Start 函数源码 osTickStart 函数源码 LOS_StartToRun 函数源码 前言 20201009 移植好内核后,开始实战内核. 源码分析 ...