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 解析(思維、重心剖分)的更多相关文章

  1. D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)

    Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...

  2. B. Kay and Snowflake 解析(思維、DFS、DP、重心)

    Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...

  3. E. Tree Queries 解析(思維、LCA)

    Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...

  4. E. Tree Reconstruction 解析(思維)

    Codeforce 1041 E. Tree Reconstruction 解析(思維) 今天我們來看看CF1041E 題目連結 題目 略,請直接看原題 前言 一開始完全搞錯題目意思,還以為每次會刪除 ...

  5. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  6. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  7. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  8. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  9. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

随机推荐

  1. 利用Z.Expressions.Eval表达式求值

    Z.Expression.Eval是一个开源的(OpenSource),可扩展的(Extensible),超轻量级(Super lightweight)的公式化语言解析执行工具包. 使用方法:1.从n ...

  2. 新版 C# 高效率编程指南

    前言 C# 从 7 版本开始一直到如今的 9 版本,加入了非常多的特性,其中不乏改善性能.增加程序健壮性和代码简洁性.可读性的改进,这里我整理一些使用新版 C# 的时候个人推荐的写法,可能不适用于所有 ...

  3. 使用VS2015从TFS获取项目后编译报错

    把VS2015关闭后,打开C:\Windows\Temp,把里面的文件清空后,重新打开VS即可.

  4. 0921 LCA练习

    1.poj 1330 数据结构中的树,在计算机科学中是非常重要的,例如我们来看看下面这棵树: 在图中我们对每个节点都有编号了. 8号节点是这棵树的根.我们定义,一个子节点向它的根节点的路径上,任意一个 ...

  5. windbg分析dump-解决mscorwks不匹配

    目录 前言 什么是mscorwks 什么是SOS 什么是mscordacwks 上述错误是什么意思? 什么时候会出现该错误 如何修复错误 符号文件目录规则 相关资料 前言 在使用.net的生产环境时, ...

  6. K8S环境的Jenkin性能问题处理续篇(任务Pod设置)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos K8S环境的Jenkin性能问题处理 本文是<K ...

  7. VS2013中带命令行参数的调试方法---C++

    今天先记录一下(也是传说中大神喜欢装逼的comment line)c++中向主函数int main(int argc,char** argv )传递4中方法,欢迎添加新方法, 然后可以参考别人写的很好 ...

  8. FreeType2使用总结(转)

    一.FreeType2简介 1. 是一个免费.开源.可移植且高质量的字体引擎: 2. 支持多种字体格式文件,并提供了统一的访问接口: 3. 支持单色位图.反走样位图渲染,这使字体显示质量达到Mac的水 ...

  9. 2016-12-04---tiny412平台下的iconv库的移植问题

    一.解决问题    在arm开发板上使用framebuff,在汉字显示时,因为只有gb2312的16*16的汉字字库,而ubuntu16.04默认    的编码方式时utf-8,因此需要进行转码(ut ...

  10. python的PEP8代码规范

    一.缩进:每级缩进用4个空格.如果缩进不正确或缩进格式不统一,一般错误信息会明确告诉你,但有时也会出现invalid syntax报错.所谓缩进不正确,python的缩进是四个空格或一个TAB,如果缩 ...