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. [BJDCTF 2nd]文件探测

    [BJDCTF 2nd]文件探测 这两天刷题碰到了一道稍微有难度的题,记录一下,有一些点是未被掌握到的. home.php: <?php setcookie("y1ng", ...

  2. Ribbon源码分析(一)-- RestTemplate 以及自定义负载均衡算法

    如果只是想看ribbon的自定义负载均衡配置,请查看: https://www.cnblogs.com/yangxiaohui227/p/13186004.html 注意: 1.RestTemplat ...

  3. MyBatis多对一,一对多,多对多,一对多关联查询

    一.Person实体类 1 public class Person { 2 private Integer personId; 3 private String name; 4 private Int ...

  4. Python-迭代协议-__iter__ __next__ iter next yield

    iter 本质是for循环调用的实质,for循环通过调用这个函数返回可迭代对象生成器形式,开始迭代取值捕获StopIteration错误退出循环 for循环首先找__iter__方法,然后再找 __g ...

  5. mysql-16-variables

    #变量 /* 系统变量: 全局变量 会话变量 自定义变量: 用户变量 局部变量 */ # 一.系统变量 #由系统提供,属于服务器层面 #1.查看所有的系统变量 show global variable ...

  6. Windows 无法验证此设备所需的驱动程序的数字签名”的问题

    转载: 1.https://jingyan.baidu.com/article/375c8e19c2b25b25f2a229a3.html 2. https://jingyan.baidu.com/a ...

  7. AE2018简单的编辑

    来源:https://jingyan.baidu.com/article/1876c8525cf522890a137651.html Ae 2018 怎样锁定图层,阻止对图层进行编辑? 听语音 原创 ...

  8. Bayer Pattern——RGGB

    原博客地址:https://blog.csdn.net/joe9280/article/details/46952947 参考:https://blog.csdn.net/wgx571859177/a ...

  9. Centos7安装MySQL8.0(RPM方式)

    人生处处皆学问,工作也是如此!过去不止一次在Linux上安装MySQL,可以说轻车熟路,但是写篇文章总结一下,发现有很多细节值得学习! 安装包选择 为什么用rpm? 在Linux系列上安装软件一般有源 ...

  10. java安全编码指南之:lock和同步的正确使用

    目录 简介 使用private final object来作为lock对象 不要synchronize可被重用的对象 不要sync Object.getClass() 不要sync高级并发对象 不要使 ...