要求这个所有的和,感觉不是很好想
首先这个图,是一条长链。
对于联通的 i 和 i+1 两个点,考虑他们对答案的贡献,如果他们不联通,那么对答案的贡献就是1
对于 l <= ai <= r 同时使得 ai+1 > r || ai+1 < l 里所有的 l 和 r,对答案的贡献都是1
反之对于 l <= ai+1 <= r 且 ai 不在范围内,所有的l 和 r对答案对贡献也是1
因此,我们可以得到
对于 ai <= ai+1 贡献值为 (a[i]-a[i-1])*(n-a[i]+1);
对于 ai >= ai+1 贡献值为 (a[i-1]-a[i])*a[i];
O(n) 求和即可
代码如下
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
int gcd(int a,int b){if (b == 0) return a; return gcd(b , a%b);}
int lcm(int a, int b){ return a/gcd(a,b)*b;}
inline int read(){
int f = 1, x = 0;char ch = getchar();
while (ch > '9' || ch < '0'){if (ch == '-')f = -f;ch = getchar();}
while (ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
return x * f;
}
const int maxn = 1e5 + 10;
LL a[maxn];
int main(){
int n = read();
LL sum = 0;
for(int i=1; i<=n; i++){
a[i] = read();
if (a[i] > a[i-1]){
sum += (a[i]-a[i-1])*(n-a[i]+1);
}else if (a[i] < a[i-1]){
sum += (a[i-1]-a[i])*a[i];
}
}
cout << sum << endl;
return 0;
}