IncDec Sequence
题目
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
Source
Poetize6
思路
题目描述和差分类似,利用差分和前缀和思想,将其转化为差分数组,初始状态都是0,把该数组进行差分就是结束状态,相当于逆推,想办法把差分数组每个数的变成0,则数组中每个数都相当。
消除:把正负匹对,一正一负相当于一次操作,可能会有剩余,
消除剩余的数(可能正负) 方法1:将0号下标看作另一个操作点
方法2:将尾坐标(end())看作另一个操作点
所以,操作次数是max(正数和,负数和的绝对值)
结果: 将剩余的数按照另一种方法消除会得到差值为1的结果,剩余几个就可以相差几个
所以为abs(正-负的绝对值)+1 // 1是不改变的情况
#include<bits/stdc++.h>
using namespace std;
int a[100010];
long long b[100010];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
// cout<<" "<<a[i]<<endl;;
}
long long po=0,ne=0;
for(int i=1;i<n;i++)
{
b[i]=a[i]-a[i-1];
// cout<<"dhslhdlashfls"<<b[i]<<endl;
if(b[i]>0) po+=b[i];
else ne-=b[i];
}
cout<<max(po,ne)<<endl<<abs(po-ne)+1;
return 0;
}