AcWing 100. 增减序列详解

原题链接:https://www.acwing.com/problem/content/101/

题目分析

题目中描述的操作需要我们使用差分数组

最少操作数

a区间的加减一可以变为差分数组b中两个元素left和right+1的加减1。

因为bi=ai-a(i-1)所以最后就是差分数组从2到n全部变为0,只剩下1和n+1

b[1]=a[1],也就是说最后所有元素都等于第一个元素

b[n+1]=a[n+1]-a[n];它存在是因为有时候要修改a[n]

最少的操作数就是将正负数配对一个加一个减,但是可能有数不够用

我们可以用a[1]和a[n+1]但是他们不用==0所以是min(pos, neg)+abs|pos-neg|

数组种类数

我们可以选择操作b1或者bn+1,

选择bn+1好了,这时候我们每次的加减1可以包含进去b1也可以不包含

所以b1的取值有abs|pos-neg|+1种

代码细节

  • min(pos, neg)+abs|pos-neg|=max(pos, neg)
  • 用longlong防止爆int

c++代码

#include<bits/stdc++.h>

using namespace std;

const int N  = 1e5 + 10;

int b[N], a[N];
long long pos, neg;

int main(){
    int n;
    cin >&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值