树的联结
题号:NC264698
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

有两棵树,第一棵树有 n 个结点,编号分别为 1, 2, \dots, n,第二棵树有 m 个结点,编号分别为 n + 1, n + 2, \dots, n + m

定义联结操作为:在第一棵树的某个结点 u第二棵树的某个结点 v 之间加一条边。

显然经过一次联结操作后,两棵树就会合为一棵树,任意两点均可达。于是记 f(u, v, s, t) 为联结 u, v 两点后 st 之间的距离。

定义结点 s, t 之间的极限距离 d(s, t) 为:在进行一次联结操作后,结点 s, t 之间的距离的最大值,即

d(s, t) = \displaystyle\max_{1 \leqslant u \leqslant n < v \leqslant n + m} {f(u, v, s, t)}

请计算并输出任意两个结点之间的极限距离之和,即

\displaystyle\sum_{1 \leqslant s < n + m} ~ \displaystyle\sum_{s < t \leqslant n + m} ~ d(s, t)

输入描述:

第一行有两个整数 n, m,分别表示两棵树的结点数。

接下来 n + m - 2 行每行两个整数 u, v,表示结点 u, v 之间有一条边。

输入数据保证:
 1 \leqslant n, m \leqslant {10}^{5}
\bullet u \neq v, 且 1 \leqslant u, v \leqslant n + m
\bullet 所给边构成满足题意的两棵树。

输出描述:

输出一个整数表示答案。
示例1

输入

复制
2 2
1 2
3 4

输出

复制
14
示例2

输入

复制
6 5
1 2
1 3
1 4
7 8
7 9
2 5
3 6
7 10
11 8

输出

复制
252

说明

第二组样例的两棵树如下图所示