IncDec Sequence
IncDec Sequence
题目描述:
给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。 问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。
输入:
第一行一个正整数n 接下来n行,每行一个整数,第i+1行的整数表示ai。
输出:
第一行输出最少操作次数 第二行输出最终能得到多少种结果
样例输入:
4
1
1
2
2
样例输出:
1
2
思路:
对于带有“将一段区间内的每个数全部加上某个值”这种操作的题目,通常考 虑差分原数列以简化情况,将对一段区间的操作转化为对某两个特定数的操作。差分原数列后可以将题目的要求转化为使得差分数列中的后n-1个值的都变 为 0 每次操作可以看为对数列中的两个数分别进行+1 和-1 记录差分数列中的 所有正数和为 s1 负数和为 s2 求最小操作次数和种数 肯定是优先在 n-1 个数 中选择两个数(即一负一正)同时进行的操作,次数为 min(s1,s2), 之后进行 abs (s1-s2)次对后 n-1 个中的非 0 数和(第 1 个或是第 n+1 个的数)的操作得到结 果 第一个数最终有 abs(s1-s2)种可能的情况 所以第一问第二问答案分别为 max(s1,s2 ) , abs(s1-s2)+1。
/****************************************************
@Author: LeafLove
@TIME: 2020-03-12
@FILENAME: cahfn.cpp
@REMARK:
****************************************************/
#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define CSE(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define Abs(x) (x>=0?x:(-x))
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;
const int maxn=1111111;
ll a[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
FAST;
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
ll high=0,low=0;
for(int i=n;i>1;i--){
if(a[i]>a[i-1]){
high+=a[i]-a[i-1];
}
else
{
low+=a[i-1]-a[i];
}
}
cout<<max(high,low)<<endl;
cout<<abs(high-low)+1<<endl;
return 0;
}