题意: 给定一个
n
n
n点,
n
−
1
n-1
n−1边的树。
f
(
L
,
R
)
f(L,R)
f(L,R)表示编号为
[
L
,
R
]
[L,R]
[L,R]的点构成的联通分量数。
求
∑
L
=
1
N
∑
R
=
L
N
f
(
L
,
R
)
\sum_{L=1}^{N}\sum_{R=L}^{N}f(L,R)
∑L=1N∑R=LNf(L,R)。
参考
q
l
s
qls
qls代码: 传送门
题解: 将点和边单独考虑。初始没有边时,共
∑
i
=
1
N
i
×
(
n
−
i
+
1
)
\sum_{i=1}^{N} i\times(n-i+1)
∑i=1Ni×(n−i+1)个连通分量(连通分量个数为
i
i
i的
L
,
R
L,R
L,R共
n
−
i
+
1
n-i+1
n−i+1个)。每增加一条边
(
a
,
b
)
,
a
≤
b
(a,b),a\leq b
(a,b),a≤b,则对于
L
≤
a
≤
b
≤
R
L\leq a\leq b\leq R
L≤a≤b≤R的
L
,
R
L,R
L,R都会减掉一个连通分量,因为增加了这条边相当于将两个联通分量合二为一了。由于
L
∈
[
1
,
a
]
,
R
∈
[
b
,
N
]
L\in[1,a], R\in[b,N]
L∈[1,a],R∈[b,N],故共减少
a
×
(
N
−
b
+
1
)
a\times(N-b+1)
a×(N−b+1)个连通分量。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n; cin >> n;
ll res = 0;
for(int i = 1; i <= n; i++) res += 1ll * i * (n - i + 1);
for(int i = 1; i < n; i++) {
int a, b; cin >> a >> b;
if(a > b) swap(a, b);
res -= 1ll * a * (n - b + 1);
}
cout << res << endl;
}