0
点赞
收藏
分享

微信扫一扫

2022.2.2 训练日记3 AcWing 100. 增减序列

非衣所思 2022-02-03 阅读 89

题目链接:增加序列


题目分析:
0.差分经典例题。
题解参考:蓝书23页。

code:
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int a[N];
int b[N];//差分数组
long long p, q;//q是正数和,p是负数和。
int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++)
    {
        scanf("%d", &a[i]);
        b[i] = a[i] - a[i - 1];//处理差分数组。
    }
    
    for(int i = 2; i <= n; i ++)//处理b[2]~b[n]即可。
    {
        if(b[i] > 0) q += b[i];
        else p -= b[i];
    }
    //b[1]有多少种取值就说明有多少种结果 故为abs(p - q) + 1
    cout << max(q, p) << endl;
    cout << abs(p - q) + 1 << endl;
    return 0;
}

总结:
1.把原序列A中的[L,R]区间都加上d的话只需要将其差分序列B中B[L]+d,B[R + 1]-d,其他位置不变,把原序列上的区间操作转化为差分序列上的单点操作,有效降低求解难度。
举报

相关推荐

0 条评论