可持久化动态图上树状数组维护01背包

来源:牛客网 —牛客练习赛29-A

题目链接:https://www.nowcoder.com/acm/contest/211/A

解题思路:如果该序列中有负数,从下标大依次向下标小的删数(从右向左),这样可以保证代价最小,此时为ans += i*m。负  数全部删完后,从下标小依次向下标大的删数(从左向右),此时正数所乘的下标最小,都为1,ans += m;

代码实现:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n, m, i;
ll ans;
int main()
{
    cin >> n;
    for(i=1; i<=n; i++)
    {
        cin >> m;
        if(m < 0)
            ans += (ll)m*i;
        else
            ans += m;
    }
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/TSY_1222/article/details/83211358