侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】【上海】【平整序列】

Allen Best
2023-08-08 / 0 评论 / 0 点赞 / 80 阅读 / 510 字
温馨提示:
本文最后更新于 2023-08-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

做一次操作将区间[i,j]加x(1或-1)等价于将b[i-1]+x、b[j+1]-x,最后要使得a[1]~a[n]均为0等价于差分数组b全为0。
故题意等价于:从b[1]~b[n+1]挑选b[i]、b[j],让b[i]+x、b[j]-x,最少操作多少次可以使得数组b全为0。而对于差分数组b中正整数b[k],要将其变为0,最少需要操作b[k]次,因此总操作次数一定不少于差分数组中所有正整数b[k]之和!
因而,只需要将构造出的查分数组正整数累加至答案即可。注意:差分数组区间[0,n+1]。

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
long long a[N],b[N],ans;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=a[i]-a[i-1];
    }
    b[n+1]=a[n+1]-a[n];
    for(int i=1;i<=n+1;i++){
        if(b[i]>0)ans+=b[i];
    }
    cout<<ans;
    return 0;
}
0

评论区