Codeforces Round #321 (Div. 2) Kefa and Company 二分

原题链接:http://codeforces.com/contest/580/problem/B

题意:

给你一个集合,集合中的每个元素有两个属性,$m_i,s_i$,让你求个子集合,使得集合中的最大m的差不超过d的情况下,s的和的最大值。

题解:

先排序,然后对于a[i],直接二分a[i].s+d的位置,然后维护一个前缀和,更新答案即可。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define MAX_N 100005
using namespace std;

typedef long long ll;

struct node{
public:
    ll m,s;
    bool operator<(const ll &x)const {
        return m < x;
    }
};

node a[MAX_N];

bool cmp(node x,node y) {
    return x.m < y.m;
}

int n;
ll d;

ll sum[MAX_N];

int main() {
    cin.sync_with_stdio(false);
    cin >> n >> d;
    for (int i = 0; i < n; i++)cin >> a[i].m >> a[i].s;
    sort(a, a + n,cmp);
    sum[0] = a[0].s;
    for (int i = 1; i < n; i++)sum[i] = sum[i - 1] + a[i].s;
    ll ans = 0;
    for (int i = 0; i < n; i++) {
        int t = lower_bound(a, a + n, a[i].m + d) - a - 1;
        if (i == 0)ans = max(ans, sum[t]);
        else
            ans = max(ans, sum[t] - sum[i - 1]);
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2015-09-23 03:25  好地方bug  阅读(208)  评论(0编辑  收藏  举报