[CF1151E] Number of Components - 组合
Description
有一条 (n(1 leq n leq 10^5)) 个节点的链,编号相邻节点有边,每个点一个权值 (a_i(1 leq a_i leq n)),(f(l,r)) 定义为权值在 ([l,r]) 的点中的连通块数量求 (sum_{l=1}^{n}sum_{r=l}^{n}f(l,r))
Solution
将连通块转化为点数-边数,分别处理
点数:每个点被算 (x(n-x+1)) 次
边数:边 (x,y) 被算 (min(x,y) cdot (n-max(x,y)+1)) 次
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
signed main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> a(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
int ans = 0;
for (int i = 1; i <= n; i++)
{
ans += a[i] * (n - a[i] + 1);
if (i < n)
ans -= min(a[i], a[i + 1]) * (n - max(a[i], a[i + 1]) + 1);
}
cout << ans << endl;
}