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; }