IncDec Sequence(差分)

发布于 2020-06-28  0 次阅读


题目描述:

给定一个长度为 (n≤10^5 ) 的数列a1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。

输入描述:

第一行一个正整数n。
接下来n行,每行一个整数,第i+1行的整数表示ai。

输出描述:

第一行输出最少操作次数。
第二行输出最终能得到多少种结果。

样例:

输入:

4
1
1
2
2

输出:

1
2

思路:

很明显的差分题,
1、每次对区间[l,r]进行+1或者-1,等于对差分数组的l进行+1或者-1,再对r+1进行-1或者+1,如果r=n,那么就相当于对l进行了+1或者-1。
2、我们只需使得差分数组的第一个位置的值为最终的数字,其他的都为0即可。
3、因为差分数组的+1或者-1操作,可以使得正数和负数相抵消(原因在1),所以只需要统计正数和负数的绝对值.
4、对于抵消完后多余的值,可以选择(1)自己进行+1或者-1操作(2)与1号位置抵消(1为l,多余值的位置-1的位置为r)
5、明显可得,第一问、max(pos,neg) ,第二问答案为abs(pos-neg)+1

AC Code:

#include <iostream>
#include <cstdio>
using namespace std;
long long n, w, z, f, step, cf;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> w;
        if (i > 0)
        {
            cf = w - step;
            if (cf >= 0)
                z += cf;
            else
                f -= cf;
        }
        step = w;
    }
    cout << max(z, f) << endl;
    cout << abs(z - f) + 1 << endl;
    return 0;
}

平平无奇的大学在读本科生