CH0304差分与构造


描述

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

输入格式

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

输出格式

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

样例输入

4
1
1
2
2

样例输出

1
2

数据范围与约定

  • 对于100%的数据,n=100000,0<=ai<2147483648
  •  1 #include
     2 using namespace std;
     3 typedef long long ll;
     4 const int N=1e5+5;
     5 ll a[N],b[N];
     6 int n;
     7 
     8 int main()
     9 {
    10     scanf("%d",&n);
    11     ll q=0,p=0;
    12     for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    13     for(int i=2;i<=n;i++)
    14     {
    15         b[i]=a[i]-a[i-1];
    16         if(b[i]>=0)q+=b[i];
    17         else p+=abs(b[i]);
    18     }
    19     ll ans=min(q,p)+abs(q-p);
    20     printf("%lld\n",ans);
    21     printf("%lld\n",abs(q-p)+1);
    22     return 0;
    23 }

相关