题解/算法 {G - Merchant Takahashi}

题解/算法 {G - Merchant Takahashi}

@LINK: https://atcoder.jp/contests/abc353/tasks/abc353_g;

很容易想到一个DP定义: DP(i): 从[0...i]选若干个 且以A[i]为结尾 的最大收益;

DP[I] = p - t*C; // 自己单独;
FOR_( II, 0, I-1){
	DP[I] = max( DP[i], DP[II] - C * abs(T[I] - T[II]) + P[I]);
}

DP优化:
把绝对值优化掉, 如果T[I] >= T[II] 此时为(P[I] - C*T[I]) + (DP[II] + C*T[II]); (我们要(DP[II] + C*T[II])d的最大值);
否则为(P[I] + C*T[I]) + (DP[II] - C*T[II]); 我们要DP[II] - C*T[II]的最大值;

因为T[?] = [0, 2e5], 我们维护区间最大值 MaxMin Ma_less, Ma_greater, 在[0, T[I]]里 找Ma_less的最大值, 在[T[I], N-1]里找ma_greater的最大值;
. 比如当前DP, 把DP[i] - C*T[i]放到Ma_less里, 把DP[i] + C*T[i]放到Ma_greater里面;

// DP[i] = DP[j] - C * abs(T[i] - T[j]) + P[i]
// @IF( T[i] >= T[j]):   DP[i] = (P[i] - C*T[i]) + (DP[j] + C*T[j]);
// @ELSE:   DP[i] = (P[i] + C*T[i]) + (DP[j] - C*T[j]);
Int64_ N, C, M;  cin>> N>>C>>M;
___MinMax_QueryModify_ Ma_less, Ma_greater;
{
    vector<Int64_> a( N, -9e18);
    Ma_less.Initialize( a.data(), a.size());
    Ma_greater.Initialize( a.data(), a.size());
}
Int64_ ANS = 0; // zero
FOR_( m, 0, M-1){
    Int64_ t, p;  cin>> t>> p;  -- t;

    Int64_ curDP;
    { // self
        curDP = p - t*C; // 注意人最开始在`[0]`位置上;
    }
    { // pre
        { // less
            auto v = Ma_less.Query_interval( 0, t).Val;
            if( v != -9e18){
                curDP = std::max( curDP, (p - C * t) + v);
            }
        }
        { // greater
            auto v = Ma_greater.Query_interval( t, N-1).Val;
            if( v != -9e18){
                curDP = std::max( curDP, (p + C * t) + v);
            }
        }
    }

    ANS = std::max( ANS, curDP);
    Ma_less.Modify_index( t, curDP + C * t);
    Ma_greater.Modify_index( t, curDP - C * t);
}
cout<< ANS;
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值