• 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;
    }
  • 相关阅读:
    再回首Java第九天
    再回首Java第八天
    再回首Java一周记
    再回首Java第六天
    再回首Java第五天
    再回首Java第四天
    再回首Java第三天
    再回首Java第二天
    再回首Java第一天
    关于i++和++i理解
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5677759.html
Copyright © 2020-2023  润新知