bzoj3043: IncDec Sequence 差分

来源:互联网 发布:c语言temp 编辑:程序博客网 时间:2024/06/05 07:47

明显要求最后差分数列除第一项都是0的情况。然而为什么答案是只用统计上升和下降的差分呢????

有个比较牵强的说法,>0的差分其实是指后面连续一段降的话只需要上升的差分这么多。

而<0的话其实是把后面连续一段升高为相同高度所需的操作数。

如果你升高的话只能连续升高,或下降的话只能连续下降。因为上升的话后面所有的数都上升了,如果你再下降的话,就会有重复的多余操作。下降同理。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#define ll long long#define inf 1000000000using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}ll ans1,ans2;int n;int a[100005];int main(){    n=read();    for(int i=1;i<=n;i++)a[i]=read();    for(int i=2;i<=n;i++)        if(a[i]>a[i-1])ans1+=a[i]-a[i-1];        else ans2+=a[i-1]-a[i];    printf("%lld\n%d",max(ans1,ans2),abs(ans1-ans2)+1);    return 0;}


0 0