【无标题】

#20019. [Senoir] Contest 19/8/11/4 - Problem D:序列

题目传送:https://tywzoj.top/problem/20019

07ddbe1cd48d44efb3979861ce4dee91.png

对于区间操作 最常见的做法是差分

在进行差分后我们发现需求变成了单点修改,最终将差分数组全部归零(即每项a[i]不存在差异

再看修改操作  每次修改在a[op]加一,在a[ed+1]剪1(op可以等于0,ed可以等于n),所以需要修改次数即为差分数组中正数与负数取max

!:(这里的正数和负数指正数和负数的绝对值数值和)

再在操作次数最少得前提下求方案数  在上述操作中会产生分支的是在操作了min(正数,负数)次后,所以分支数为abs(正数-负数)+1

以原数组1 3 2 4为例,差分数组2 -1  2,正数和为4,负数为1,最少需要操作4次;产生分支情况在操作1次后,会产生都变成1,2,3,4四个分支。

代码如下:(不开long long见祖宗😅

#include <bits/stdc++.h>

using namespace std;

long long n, zs = 0, fs = 0, temp, tempp, cf[100005];

int main() {

    freopen("sequence.in", "r", stdin);

    freopen("sequence.out", "w", stdout);

    scanf("%lld", &n);

    for (int i = 1; i <= n; i++) {

        scanf("%lld", &temp);

        cf[i] = temp - tempp;

        tempp = temp;

    }

    for (int i = 2; i <= n; i++) {

        if (cf[i] > 0)

            zs += cf[i];

        else if (cf[i] < 0)

            fs -= cf[i];

    }

    printf("%lld\n%lld", max(zs, fs), abs(zs - fs) + 1);

    return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值