BZOJ 3043

 

Description

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

Input

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

Output

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

Sample Input

4
1
1
2
2

Sample Output


1
2

HINT

 

对于100%的数据,n=100000,0<=ai<2147483648

 

题解:

明显要求最后差分数列除第一项都是0的情况。然而为什么答案是只用统计上升和下降的差分呢????

有个比较牵强的说法,>0的差分其实是指后面连续一段降的话只需要上升的差分这么多。

而<0的话其实是把后面连续一段升高为相同高度所需的操作数。

如果你升高的话只能连续升高,或下降的话只能连续下降。因为上升的话后面所有的数都上升了,如果你再下降的话,就会有重复的多余操作。下降同理。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
int n;long long ans1,ans2,a[N];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=2;i<=n;i++){
        if(a[i]>a[i-1]) ans1+=a[i]-a[i-1];
        else ans2+=a[i-1]-a[i];
    }
    printf("%lld\n%lld\n",max(ans1,ans2),abs(ans1-ans2)+1);
    return 0;
}

 

posted @ 2016-07-16 20:22  神犇(shenben)  阅读(267)  评论(0编辑  收藏  举报