题解 | #购物#

购物

https://www.nowcoder.com/practice/ca7f5b2c0c91465f9ce0f15973e2e976

/*
*  不是特别懂,这个思路,照着题解敲一遍,日后再来,好好研究!!! 
*/


#include <bits/stdc++.h>


using namespace std;

typedef long long ll;

const ll maxn = 1000000;

vector<ll> seg(maxn), seg2(maxn); // 两个线段树! 


void pushup(int node) {
    if (seg[node << 1] <= seg[node << 1 | 1]) {
        seg[node] = seg[node << 1];
        seg2[node] = seg2[node << 1];
    } else {
        seg[node] = seg[node << 1 | 1];
        seg2[node] = seg2[node << 1 | 1];
    }
}

void build(int l, int r, int node) {
    if (l == r) {
        seg[node] = 0;
        seg2[node] = l;
        return ;
    }
    int mid = (l + r) >> 1;
    build(l, mid, node << 1); // 左孩子
    build(mid + 1, r, node << 1 | 1); // 右孩子!
    pushup(node);
}

pair<ll, ll> nums[maxn];

ll ret(0);

void update(int l, int r, int pos, int node, ll ai, ll c) {
    if (l == r) {
        seg[node] = max(seg[node], ai) + c;
        ret = max(ret, seg[node]);
        return ;
    }

    int mid = (l + r) >> 1;
    if (pos <= mid) {
        update(l, mid, pos, node << 1, ai, c);
    } else {
        update(mid + 1, r, pos, node << 1 | 1, ai, c);
    }
    pushup(node);

}


int main() {
    int n, m;
    cin >> n >> m;
    build(1, m, 1);
    vector<ll> a(n + 1), s(n + 1);

    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> s[i];
        nums[i] = make_pair(a[i], s[i]);
    }

    sort(nums + 1, nums + n + 1);

    for (int i = 1; i <= n; i++) {
        int pos = seg2[1];
        update(1, m, pos, 1, nums[i].first, nums[i].second);
    }
    cout << ret << endl;
    return 0;
}

全部评论

相关推荐

程序员小白条:你不是有一段实习了吗,现在找中大厂实习?过段时间要秋招了
我的简历长这样
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务