ARC 123 D - Inc, Dec - Decomposition (思维构造+DP)

31 篇文章 0 订阅
18 篇文章 0 订阅

链接

题意:

给出A序列,让你构造出B,C序列要求满足:

  • B i + C i = A i B_i+C_i=A_i Bi+Ci=Ai
  • B序列递增
  • C序列递减
    使得 ∑ ∣ B i ∣ + ∣ C i ∣ \sum |B_i|+|C_i| Bi+Ci最小化

分析:

我们要让B递增,C递减, ∑ \sum 那么我们肯定要 满足 B i = B i + 1 B_i=B_{i+1} Bi=Bi+1或者 C i = C i + 1 C_i=C_{i+1} Ci=Ci+1
所以一旦我们选择好 B 1 B_1 B1也就确定了整个序列。
我们看B,C是相反的单调性,不好分析,我们C变成-C这样,C序列也是递增的了,并且对于 ∑ ∣ B i ∣ + ∣ C i ∣ \sum |B_i|+|C_i| Bi+Ci答案不变
所以如果

  • A i + 1 > A i A_{i+1}>A_{i} Ai+1>Ai那么我们将差值加到B上让 B i + 1 = B i + ( A i + 1 − A i ) B_{i+1}=B_{i}+(A_{i+1}-A_{i}) Bi+1=Bi+(Ai+1Ai)
  • A i + 1 < A i A_{i+1}<A_{i} Ai+1<Ai那么我们将差值加到C上让 C i + 1 = C i + ( A i − A i + 1 ) C_{i+1}=C_{i}+(A_{i}-A_{i+1}) Ci+1=Ci+(AiAi+1)

让正的都加上递增序列,让较少的都加到递减序列。
然后我们将其放去同一个集合,我们可以让其同时移动k,可以左移(-),同样也可以右移(+),使其绝对值和最小,那肯定找到中位数让其左移中位数呀。

ll n, m;
ll a[N];
std::vector<ll> v;
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++){
        scanf("%lld",&a[i]);
    }
    ll A=a[1],B=0;
    v.push_back(A);
    v.push_back(B);
    for(int i=1;i<n;i++){
        ll x = a[i+1]-a[i];
        if(x>=0) A+=x;
        else B-=x;
        v.push_back(A);
        v.push_back(B);
    }
    sort(v.begin() , v.end());
    ll ans=0;
    for(int i=0;i<v.size();i++){
        ans += abs(v[i]-v[n]);
    }
    cout<<ans<<endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值