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

今天我們來看看CF685B

題目連結

題目

給你一棵樹,要求你求出每棵子樹的重心。

前言

完全不知道我怎麼想到的

想法

首先會感覺是樹狀DP,並且狀態是每個子樹的重心。

在建重心剖分樹的時候,我們找根為\(v\)的樹的重心的方法是看看目前節點有沒有大小大於目前樹的一半(\(size[v]/2\))的子樹(令根為\(u\)),並且繼續看看這棵子樹有沒有大小大於\(size[v]/2\)的子樹(注意,不是\(size[u]\)),如果沒有的話,\(u\)就是重心。

注意到,由於\(u\)的重心代表的點是子樹大小都小於\(size[u]\)的點,只要我們慢慢由這個重心往上回朔(\(u\)的重心\(\rightarrow\)\(u\)的重心的父節點),總能找到所有子樹大小都小於且最接近\(size[v]\)的點,而那就是答案了。

需要順便維護每個點最大的子樹的大小在\(mx[]\)裡,加快運算。

由於我們是從\(u\)的重心開始找,所以即使整棵樹退化成一個鍊,我們每次也只需要往上移一格就找到答案了。而更一般的狀況我猜想複雜度接近\(O(n\lg n)\),但暫時還不確定怎麼證明Orz

程式碼:

const int _n=3e5+10;
int t,n,q,v,p,dp[_n],sz[_n],mx[_n],fa[_n];
VI G[_n];
void dfsSz(int v,int faa){
fa[v]=faa,sz[v]=1;
for(int u:G[v])if(u!=faa)dfsSz(u,v),sz[v]+=sz[u],mx[v]=max(mx[v],sz[u]);
}
void dfs(int v,int faa){
for(int u:G[v])if(u!=faa)dfs(u,v);
for(int u:G[v])if(u!=faa and sz[u]>sz[v]/2){
u=dp[u];while(mx[u]<=sz[v]/2)dp[v]=u,u=fa[u];
return;
}
dp[v]=v;
}
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>q;rep(i,2,n+1){cin>>p;G[i].pb(p),G[p].pb(i);}
dfsSz(1,0),mx[0]=sz[1],dfs(1,0);
while(q--){
cin>>v;cout<<dp[v]<<'\n';
}
return 0;
}

標頭、模板請點Submission看

Submission

B. Kay and Snowflake 解析(思維、DFS、DP、重心)的更多相关文章

  1. B. Nauuo and Circle 解析(思維、DP)

    Codeforce 1172 B. Nauuo and Circle 解析(思維.DP) 今天我們來看看CF1172B 題目連結 題目 略,請直接看原題 前言 第一個該觀察的事情一直想不到,看了解答也 ...

  2. D. Alyona and Strings 解析(思維、DP)

    Codeforce 682 D. Alyona and Strings 解析(思維.DP) 今天我們來看看CF682D 題目連結 題目 略,請直接看原題. 前言 a @copyright petjel ...

  3. C. Vladik and Memorable Trip 解析(思維、DP)

    Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...

  4. B. Once Again... 解析(思維、DP、LIS、矩陣冪)

    Codeforce 582 B. Once Again... 解析(思維.DP.LIS.矩陣冪) 今天我們來看看CF582B 題目連結 題目 給你一個長度為\(n\)的數列\(a\),求\(a\)循環 ...

  5. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

  6. B. Two Fairs 解析(思維、DFS、組合)

    Codeforce 1276 B. Two Fairs 解析(思維.DFS.組合) 今天我們來看看CF1276B 題目連結 題目 給一個連通圖,並給兩個點(\(a,b\)),求有多少點對使得:任一路徑 ...

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

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

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

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

  9. E. Xenia and Tree 解析(思維、重心剖分)

    Codeforce 342 E. Xenia and Tree 解析(思維.重心剖分) 今天我們來看看CF342E 題目連結 題目 給你一棵樹,有兩種操作,把某點標成紅色或者查詢離某點最近的紅點有多遠 ...

随机推荐

  1. 《Redis入门指南》笔记

    第1章 简介 1.1 历史与发展 2008年 意大利创业公司创始人因对mysql性能不满意,于是他决定开发redis. 2009年 redis初版由他一个人开发完成.redis是"remot ...

  2. (转)HttpServletResquest对象

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息. 1 ...

  3. 智慧组织(SO)如何敏捷构建?

    人类社会正处于千年未有之变局的关键时刻--互联网.大数据.AI和实体经济深度融合,数据正在重新定义世界并重构财富体系."新旧交织.破立并存",数字经济方兴未艾,传统势力逐步淡出.各 ...

  4. Metasploit之漏洞利用( Metasploitable2)

    每个操作系统都会存在各种Bug,像Windows这样有版权的操作系统,微软公司会快速地开发针对这些Bug或漏洞的补丁,并为用户提供更新.全世界有大量的漏洞研究人员会夜以继日地发现.研究新的Bug,这些 ...

  5. 深入解析Vue里函数的调用顺序介绍

    今天为大家分享一篇对vue里函数的调用顺序介绍,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. method用来定义方法的,比如你@click=& ...

  6. Ubuntu部署和体验Nexus3

    关于Nexus 如下图,在局域网部署了Nexus之后,可以缓存中央仓库的jar,开发者开发的二方库发布到Nexus上,局域网内的其他人也可以从Nexus下载这些二方库使用: 环境信息 本次实战是在Li ...

  7. CTFshow_Web入门源码

    Web1 题目打开始是这样的 直接看源码 Web2 题目打开是这样的,右键无法打开菜单,无法查看源码,F12也不可以 更改JavaScript权限,即可查看源码 Web3 真就抓个包看看 Web4 访 ...

  8. Layman ThinkPHP 中 where条件 or,and 同时使用

    Eg:('a'=1 and 'b'=2) or ('c'=3 and 'd'=4) and 'e'=5 解决方法 $condition1['a'] = 1; $condition1['b'] = 2; ...

  9. C++ “string”: 未声明的标识符

    转载:https://blog.csdn.net/kkkmmmjjjj/article/details/53780549 解决方案: 要添加using namespace std;语句在宏定义后面. ...

  10. lens distortion

    来源:http://michel.thoby.free.fr/Fisheye_history_short/International_Standards_about_Distortion.html H ...