C. Helping the Nature #802 div2

Problem - C - Codeforces

这个题说实话看完题目第一眼反应的就是差分,还是不擅长英文题目吗?当时一个劲的翻译,翻译完只是了解了一下题目意思,把重要信息都漏了,还是要多多注意一下

连续的某一段同时+d或者-d,这首先就应该要想到差分,然后差分数组构造出来之后,因为最后统统变成0,所以连同b[1]也要变成0

那具体怎么变呢

根据题意:

操作1:d[1]-1   d[i+1]+1

操作2:d[i]-1    d[n+1]+1

操作3:d[1]+1   d[n+1]-1

差分数组说实话b[n+1]这个可以随便用,前面的都是0即可

所以,到这里还不会吗?我还真不会QAQ

举个栗子:

10 4 7

10 -6 3

从后往前枚举,这样不会有影响,3—>0,必定是减3,可以进行操作2(对后缀进行操作),然后在总次数上+3

-6—>0 需要+6,这是某一前缀啊,可以是操作1,不过这里的b[1]要进行变化(其实操作几都可以,我们需要选一个最优的)

然后到最后了b[1]要变成0,所以总次数+abs(b[1])就是答案了

复制代码
#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll a[N],b[N];
int main(){
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=a[i]-a[i-1];
        }
        ll sum=0;
        for(int i=n;i>=2;i--)
        {
            if(b[i]>0) sum+=b[i];
            else if(b[i]<0)
            {
                sum-=b[i];
                b[1]+=b[i];
            }
        }
        cout<<abs(b[1])+sum<<"\n";
    }
    return 0;
}
复制代码

 

posted @   小志61314  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示