正题
题目链接:https://www.luogu.com.cn/problem/P4552
题目大意
给出nnn个数,每次可以选择一个区间加一或减一,求最少操作使得所有数相等,并且求可能的最终序列个数。
解题思路
在差分数组上操作,那么操作变为将差分数组上一个数+1+1+1且一个数−1-1−1(当然当l=1l=1l=1或r=nr=nr=n时就是只改变一个数)。所以最少操作数就是正数的和和负数的绝对值和的最大值。
序列种数,假设正数和zzz大于负数和fff,那么其实对于f∼zf\sim zf∼z这个范围内的我们都可以选择是让l=1l=1l=1来修改或者r=nr=nr=n来修改,所以个数和就是abs(f−z)+1abs(f-z)+1abs(f−z)+1
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,a[1100000],z,f;
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);ll x=a[i]-a[i-1];if(i==1)continue;z+=(x>0)*x;f-=(x<0)*x;}printf("%lld\n%lld",max(z,f),abs(z-f)+1);
}