CF1901B题解

· · 题解

思路

注意到题目实质上就是在求在一个全 0 数组中不断对其子串加 1 至少加多少次才能变成指定数组,但答案要减 1,故考虑此方法:

注意到我们可以把数组变成柱状图并“切片”,有几片答案就是几,而片数很好统计:每当数组元素增加时都会产生一个或几个“切片”的左端,增加几就是几个“切片”。以下就是代码实现:

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, a[200005], ans;
void solve(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    a[0] = 0; ans = 0;
    for(int i = 1; i <= n; i++){
        if(a[i] > a[i-1]){
            ans += a[i] - a[i-1];
        }
    }
    cout << ans-1 << endl;
}
signed main(){
    int t;
    cin >> t;
    while(t--) solve();
    return 0;
}

注意事项: