题意:求出两条不相交的路的不同长度对。

题解:换根dp维护最长、次长、次次长链,维护子树的直径和子树的次长直径,线段树区间更新,单点查询。

代码:

#include <bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int maxn=1e5+5;
int tree[maxn*4];
int T,n;
void build(int x,int l,int r){tree[x]=0;if(l==r) return ;int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);
}void push_up(int x){tree[ls]=max(tree[x],tree[ls]);tree[rs]=max(tree[x],tree[rs]);
}void add(int x,int l,int r,int L,int R,int val){if(l==L&&r==R){tree[x]=max(tree[x],val);return ;}push_up(x);int mid=(l+r)>>1;if(R<=mid) add(ls,l,mid,L,R,val);else if(L>mid) add(rs,mid+1,r,L,R,val);else {add(ls,l,mid,L,mid,val);add(rs,mid+1,r,mid+1,R,val);}
}int query(int x,int l,int r,int pos){if(l==r){return tree[x];}push_up(x);int mid=(l+r)>>1;if(pos<=mid) return query(ls,l,mid,pos);else return query(rs,mid+1,r,pos);
}
int p[maxn][3],f[maxn][2];
vector<int>g[maxn];
void dfs(int u,int fa){f[u][0]=f[u][1]=0;p[u][0]=p[u][1]=p[u][2]=1;int len=g[u].size();for(int i=0;i<len;i++){int v=g[u][i];if(v==fa) continue;dfs(v,u);p[u][2]=max(p[u][2],p[v][0]+1);if(p[u][1]<p[u][2]) swap(p[u][1],p[u][2]);if(p[u][0]<p[u][1]) swap(p[u][0],p[u][1]);f[u][1]=max(f[u][1],max(f[v][0],p[v][0]+p[v][1]-1));if(f[u][0]<f[u][1]) swap(f[u][0],f[u][1]);}
}void dfs2(int u,int fa){int len=g[u].size();for(int i=0;i<len;i++){int v=g[u][i];if(v==fa) continue;int ans=0,t=0;if(p[u][0]==p[v][0]+1)ans=max(ans,p[u][2]+p[u][1]-1),t=max(t,ans);else if(p[u][1]==p[v][0]+1)ans=max(ans,p[u][0]+p[u][2]-1),t=max(t,ans);elseans=max(ans,p[u][0]+p[u][1]-1),t=max(t,ans);if(f[u][0]==f[v][0]||f[u][0]==p[v][0]+p[v][1]-1)ans=max(ans,f[u][1]);else ans=max(ans,f[u][0]);add(1,1,n,1,ans,max(f[v][0],p[v][0]+p[v][1]-1));add(1,1,n,1,max(f[v][0],p[v][0]+p[v][1]-1),ans);if(f[u][0]==f[v][0]||f[u][0]==p[v][0]+p[v][1]-1)f[v][1]=max(f[v][1],f[u][1]);else f[v][1]=max(f[v][1],f[u][0]);f[v][1]=max(f[v][1],t);if(f[v][0]<f[v][1]) swap(f[v][0],f[v][1]);if(p[u][0]==p[v][0]+1)p[v][2]=max(p[v][2],p[u][1]+1);elsep[v][2]=max(p[v][2],p[u][0]+1);if(p[v][1]<p[v][2]) swap(p[v][1],p[v][2]);if(p[v][0]<p[v][1]) swap(p[v][0],p[v][1]);dfs2(v,u);}
}int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=0;i<=n;i++) g[i].clear();for(int i=1;i<=n-1;i++){int u,v;scanf("%d %d",&u,&v);g[u].push_back(v);g[v].push_back(u);}build(1,1,n);dfs(1,0); dfs2(1,0);long long ans=0;for(int i=1;i<=n;i++) ans+=(long long)(query(1,1,n,i));printf("%lld\n",ans);}return 0;
}

Rikka with Travels相关推荐

  1. 1007 Rikka with Travels Rikka with Travels

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

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

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

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

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

  4. hdu 6686 Rikka with Travels

    这里总结一下树的直径的一些性质 1.从任意一点出发,到达的最大深度的点,一定可以作为树的直径的一个端点. 2.两棵树之间连接一条线,合并之后的树的直径一定可以有原来两棵树的4个直径端点构成. 思路:  ...

  5. Rikka with Travels【换根树dp】

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

  6. 2019 杭电第九场1007 Rikka with Travels

    大佬博客学习来自: https://blog.csdn.net/qq_40791842/article/details/99761346 大佬博客说这题涉及换根dp?我怎么没看出哪有换根dp思想? 枚 ...

  7. 2019HDU多校补题

    心得:做不出,补不动 HUD第一场: 1001 Blank Y 1002 Operation Y 1003 Milk 1004 Vication Y 1005 Path Y 1006 Typewrit ...

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

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

  9. HDU 6090 Rikka with Graph

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

最新文章

  1. 【计算机网络】第五章 数据链路层(3)
  2. 不装.net Framework 也能运行WinForm程序,用飞信(转)
  3. linux下的access()函数判断文件是否存在、打印时间
  4. 平顶山学院计算机专业是几本,平顶山学院是几本_是二本还是三本大学?
  5. C++实现chaining链式算法(附完整源码)
  6. hive 自定义元数据表_[一起学Hive]之十四-Hive的元数据表结构详解
  7. L - Lookup Performance(主席树)
  8. 使用wxWidgets编程——第一步
  9. applicationproperties不是小叶子_为何“砂糖桔”是带着叶子出售?原来其中有着“猫腻”,涨知识了...
  10. IOCP扩展方法AcceptEx, DisconnectEx, GetAcceptExSockaddr用法示例
  11. EDA实验课课程笔记(一)——linux操作系统及linux下的基本指令
  12. 热部署Devtools
  13. 如何缩减XFS分区格式的根目录
  14. 单工通信、半双工通信和全双工通信之间有什么区别。
  15. ToggleButton开关按钮
  16. sql server 2008 R2 与 sql server 2012 下载地址(包括x86、x64)
  17. Valgrind工具简介
  18. 人工智能的出现,赋予零售业6种应用新生命!
  19. 碎片化的时代,如何学习
  20. 计算机网络实验报告-632007060215

热门文章

  1. perror()函数
  2. 公安部紧急预警!新型“美团短信”诈骗,目前已多人中招
  3. 信息搜集学习--在线工具学习
  4. FileOutputStream文件写入类
  5. 低成本2.4G+MCU的SOC芯片,极其适合做低成本玩具灯控等方案
  6. 《区块链技术与应用》北大肖臻老师——课程笔记【4-5】
  7. 几款主流快速开发平台比较
  8. Python的格式化输出(炒鸡详细)
  9. C++ 数据结构——BF算法
  10. 健康管理系统第六天(移动端开发之体检预约_经典五表联查_调用阿里云提供的短信服务进行短信验证码发送)