[Poetize6] IncDec Sequence

题面:Please contact with lydsy2012@163.com!

给定一个长度为n的数列a1,a2,⋯,an,每次可以选择一个区间[l,r]使这个区间内的数都加1或者都减1。

请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

那么就可以把这玩意弄成一个差分数组,然后就是把2~n都弄成0,一次可以让一个位置++,一个位置--,所以答案就是正数和 和 负数和 的绝对值最大值。方案数就是abs(正数和-|负数和|)+1。代码:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=100005;
long long n,d[N],a[N],ans,bns;
int main() {
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=2;i<=n;i++) d[i]=a[i]-a[i-1],ans+=d[i]*(d[i]>0),bns-=(d[i]<=0)*d[i];
    cout<<max(ans,bns)<<endl;
    cout<<abs(ans-bns)+1;
    return 0;
}
IncDec Sequence

 

posted @ 2018-09-18 15:14  SWHsz  阅读(181)  评论(0编辑  收藏  举报