您的位置:首页 > 产品设计 > UI/UE

bzoj3043 IncDec Sequence

2018-01-28 22:39 597 查看

Description

给定一个长度为n的数列{a1,a2…an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。

问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

对于100%的数据,n=100000,0<=ai<2147483648

Solution

一个很naive的想法是三分一个最终结果,但是发现这样做不出第二问

考虑差分这个a。我们的目的是使得差分数组c中2~n位都为0,想到修改[l,r]实际上是修改l和r+1,答案实际上是正数和与负数和绝对值中较小辣个

由于经过变换后的数列只取决于c1,观察可发现c1只在处理剩余的正数时被改变了,第二问答案就是abs(pos-neg)+1

Code

#include <stdio.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
using namespace std;
typedef long long LL;
const int N=100005;
LL a
,c
;
int main(void) {
LL n,q=0,p=0; scanf("%lld",&n);
rep(i,1,n) scanf("%lld",&a[i]);
rep(i,1,n) c[i]=a[i]-a[i-1];
rep(i,2,n) q+=(c[i]>0)*c[i];
rep(i,2,n) p+=-(c[i]<0)*c[i];
printf("%lld\n%lld\n", max(p,q),abs(p-q)+1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: