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;
}
posted @ 2020-03-15 16:57  落水清心  阅读(147)  评论(0编辑  收藏  举报