题面: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; }