码迷,mamicode.com
首页 > 其他好文 > 详细

cf1151e number of components

时间:2019-10-25 20:16:28      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:template   oid   getch   cst   nts   else   char   否则   efi   

很常见的思想:将整体求改为统计每个部分的贡献

本题中统计[l, r]时, 每个连通块有一个重要特征, 最右端的数在[l,r]中而下一个数不在(好像是句废话

那么我们分别考虑每个点对连通块的贡献, 即它是某个连通块的右端点, 这样可以保证每个连通块只会被算一次

对于序列 \(a_1a_2\cdots a_n\)\(a_i < a_{i+1}\) l的范围是1~\(a_i\) r的范围是\(a_i\) ~ $ a_j-1$ ans += (a[i+1] - a[i]) * a[i];

否则 同理 ans += (n-a[i]+1) * (a[i] - a[i+1]);

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
template <typename T>
void read(T &x) {
    x = 0;int f = 1;
    char c = getchar();
    for (;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for (;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    x *= f;
}
const int N = 100050;
ll n, a[N], ans;
int main() {
    read(n);
    for (int i = 1;i <= n; i++) read(a[i]);
    for (int i = 1;i <= n; i++) {
        if (a[i+1] > a[i]) 
            ans += (a[i+1] - a[i]) * a[i];
        else ans += (n-a[i]+1) * (a[i] - a[i+1]);
    }
    cout << ans << endl;
    return 0;
}

cf1151e number of components

标签:template   oid   getch   cst   nts   else   char   否则   efi   

原文地址:https://www.cnblogs.com/Hs-black/p/11739937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!