bzoj 3043 (差分序列运用)

维护差分序列 显然要使差分序列的后n-1位为0
对于原来的区间操作 只需要单点修改或者两个点修改
就转化成了 对于差分序列但以一个数+1 或 -1 或者一个+1同时一个-1
ans1=max(sum1,sum2)sum1=Σbi(bi>0)sum2=absΣ(bi<0)
求方案数的话嘛 也就是不同的b1 只有+1 或 -1的操作才可能影响到b1
这里并不是只有-1才会影响到b1 操作前半段+1和操作后半段-1是等效的
也就是说 前半段+1 会导致单点-1 后半段-1也会导致单点-1 是一样滴
现在搞出所有的单点操作就ok了
     所有操作    -     两个点的操作
ans1=max(sum1,sum2)-min(sum1,sum2)+1
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 200010
#define ll long long
using namespace std;
ll n,a[maxn],b[maxn],ans1,ans2;
ll init()
{
    ll x=0;char s=getchar();
    while(s<'0'||s>'9')s=getchar();
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x;
}
int main()
{
    n=init();
    for(int i=1;i<=n;i++)
      a[i]=init();
    for(int i=1;i<=n;i++)
      b[i]=a[i]-a[i-1];
    ll s1=0,s2=0;
    for(int i=2;i<=n;i++)
      if(b[i]>0)s1+=b[i];
      else s2-=b[i];
    ans1=max(s1,s2);
    ans2=max(s1,s2)-min(s1,s2)+1;
    cout<<ans1<<endl<<ans2<<endl;
    return 0;
}

 

posted @ 2016-07-17 07:55  一入OI深似海  阅读(279)  评论(0编辑  收藏  举报