Codeforces Round #553 (Div. 2) E - Number of Components

12 篇文章 0 订阅
11 篇文章 0 订阅

要求这个所有的和,感觉不是很好想

首先这个图,是一条长链。

对于联通的 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值