这里总结一下树的直径的一些性质

1.从任意一点出发,到达的最大深度的点,一定可以作为树的直径的一个端点。

2.两棵树之间连接一条线,合并之后的树的直径一定可以有原来两棵树的4个直径端点构成。

思路: 首先,若其中一条路径与原来直径不相交,那么其中一条线一定选为直径。否则两条路径都与直径相交。最后求矩形面积并的时候需要从后向前遍历,从前往后做不了。

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn =  100005;
const int maxm = 200005;
int tot,he[maxn],ver[maxm],ne[maxm],st,vis[maxn],L[maxn],S[maxn],MX,MXU[maxn],MXD[maxn];
void init(int n){tot = 1;for( int i = 0;i <= n;i++ ) he[i] = vis[i] = L[i] = S[i]=MX = 0;
}
void add( int x,int y ){ver[++tot] = y;ne[tot] = he[x];he[x] = tot;
}
int d[maxn],mx,f[maxn];
void dfs1( int x,int fa ){f[x] = fa;for( int cure = he[x];cure;cure = ne[cure] ){int y = ver[cure];if( y == fa ) continue;d[y] = d[x] + 1;if( d[y] >mx ){st= y;mx = d[y];}dfs1(y,x);}
}
void dfs2( int x,int fa ){for( int cure = he[x];cure;cure = ne[cure] ){int y = ver[cure];if( y == fa ) continue;dfs2(y,x);if( vis[x] ){if( !vis[y] ){//S[x] = max( S[x],L[y]+1 );L[x] = max( L[x],L[y]+1 );}}else{S[x] = max( S[x],L[y]+1 );if( S[x] > L[x] )swap( S[x],L[x] );}}if(!vis[x]){//if(!flag) L[x] = 1;MX = max(MX,S[x] + L[x]);}else{MXU[x] = d[x] + L[x];MXD[x] = mx - d[x] + L[x];}
}
int main(){int T,n;scanf("%d",&T);while(T--){scanf("%d",&n);init(n);for( int x,y,i = 1;i < n;i++ ) scanf("%d%d",&x,&y),add(x,y),add(y,x);d[1] = 0;st = 1;mx = 0;dfs1(1,0);d[st] = 0;mx = 0;dfs1(st,0);int x= st;vector<int> ve;while(x){ve.push_back(x);vis[x] = 1;x =f[x];}dfs2( ve.back() ,0);for( int i =0;i < ve.size();i++ ){if( i ) MXD[ve[i]] = max( MXD[ ve[i] ],MXD[ ve[i-1] ] );}for( int i = ve.size()-1;i >= 0;i-- ){if( i != ve.size()-1 ) MXU[ ve[i] ] = max( MXU[ ve[i] ],MXU[ ve[i+1] ] );}vector<pii> v;for( int i =0;i < ve.size()-1;i++ ){v.push_back( pii( MXD[ ve[i] ]+1,MXU[ ve[i+1] ]+1 ) );v.push_back( pii( MXU[ ve[i+1] ]+1,MXD[ ve[i] ]+1 ) );}if( ve.size() != n ) mx++;v.push_back( pii( MX+1,mx ) );v.push_back( pii( mx,MX+1 ) );sort( v.begin(),v.end() );int h = 0;long long ans = 0;for( int i = v.size()-1;i >= 0;i-- ){pii x = v[i];if( x.second > h ) {ans += 1LL * x.first * (x.second-h);h = x.second;}}printf("%lld\n",ans);}return 0;
}

hdu 6686 Rikka with Travels相关推荐

  1. 2019 Multi-University Training Contest 9 1007 Rikka with Travels

    HDU 6686 Rikka with Travels 题意: 在一颗树上选择两条不相交的路径的可能性有多少,路径长度定义为路径的顶点数. 题解: 初步思考,观察样例可以发现,求的是两条路径的有序对, ...

  2. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  3. hdu 6086 Rikka with String(AC自动机+状压dp)

    题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...

  4. 1007 Rikka with Travels Rikka with Travels

    文章目录 Rikka with Travels Rikka with Travels 换根dp #include <bits/stdc++.h> #define mem(ar,num) m ...

  5. Rikka with Travels 动态维护树直径

    Rikka with Travels 题意:求两条不相交的路线长度的有序对数. 题解:暴力枚举每条边对应两个点对应子树的树直径. 注意:不要用倍增求lca,不然时间会挂,要用树剖求. #include ...

  6. HDU 6085 Rikka with Candies (暴力压位)

    题目链接 HDU 6085 Rikka with Candies 分析 其实很容易想到一个有技巧的暴力方法,我们可以这样办 首先对于每一个 AiA_i 我们考虑比 AiA_i 大的部分 BB ,对于这 ...

  7. Rikka with Travels【换根树dp】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6686 不写题解了,写不动 还有其他简单的做法 #include <bits/stdc++.h&g ...

  8. HDU 6092 Rikka with Subset 思维 递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6092 题目描述: 给你一个集合的所有子集各个和, 让你找到这个集合, 输出字典序最小 解题思路: 下 ...

  9. HDU 6090 Rikka with Graph

    Rikka with Graph 思路: 官方题解: 代码: #include<bits/stdc++.h> using namespace std; #define ll long lo ...

最新文章

  1. python序列类型包括哪三种映射类型_python序列类型包括哪三种_后端开发
  2. 终于!这个强大的「开源图像识别系统」上线了!
  3. An error occurred during the file system check
  4. Caffe官方教程翻译(7):Fine-tuning for Style Recognition
  5. c#控制台应用程序,如何实现隐藏DOS窗口
  6. python语言程序设计实践教程答案实验六_20192417 实验一《Python程序设计》实验报告...
  7. [thinkphp] 是如何输出一个页面的
  8. 包含JS交互的混淆出错
  9. 北京创客空间_世界上最大的创客空间,可增强开放安全性等
  10. java代码操作注册表,java操作注册表范例代码
  11. yiibooster+bsie
  12. Netty阶段性学习总结(一)
  13. redis数据类型之List
  14. 本地java源代码上传码云
  15. 专科学历去学计算机,前景到底如何?
  16. 阿里云主机的公网带宽和私网带宽的介绍
  17. Android APK脱壳--腾讯乐固、360加固一键脱壳
  18. 3DES加密,苹果、Java 、安卓 平台一致的加密工具
  19. gdc矫正_GDC 2015的众多游戏
  20. OBS插件开发以及OBS插件的选择(obs直播插件)

热门文章

  1. 交换机获取MAC地址
  2. 风云编程python基础语法(6)
  3. 数值计算方法(Numerical Methods)MATLAB实现(1)---Gauss消元法、Doolittle分解
  4. 疫情控制住了,公司却倒闭了!
  5. Android Launcher3简介
  6. 浅谈OpenNI之我见
  7. 哪些语言适用于人工智能 选哪个开发语言更好
  8. python新浪股票接口 2019_用python爬虫进行新浪腾讯股票数据采集
  9. 安装Python 后安装Python-dev
  10. delphi XE的字符串处理