题意:Kefa这个人要去吃饭,他要邀请一些朋友一起去,他的每个朋友有两个属性金钱和关系度,要求邀请的人里边任意两个人之间的金钱差的绝对值不大于d;求被邀请的所有朋友的关系度的和的最大值。
思路:将朋友按金钱从小到大排序,然后对关系度用尺取法求得最大值 ,这里要用前缀和来求区间内的关系度的和,不然会TLE。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define FRE() freopen("in.txt","r",stdin)
#define INF 0x3f3f3f3f
#define inf 1000000000000
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn = 1e5+10;
struct Fi
{
ll m,f;
}fp[maxn];
ll sum[maxn];
bool cmd(Fi &a,Fi &b)
{
return a.m < b.m;
}
int main()
{
ll n,d;
memset(sum,0,sizeof(sum));
scanf("%lld%lld",&n,&d);
for(int i = 1; i <= n; i++)
scanf("%lld%lld",&fp[i].m,&fp[i].f);
sort(fp+1, fp+n+1, cmd);
for(int i = 1; i <= n; i++)
sum[i] = sum[i-1] + fp[i].f;
int l = 1,r = 1;
ll ans = -1;
while(r <= n && l <= n)
{
if(fp[r].m - fp[l].m < d)
{
ans = max(ans, sum[r] - sum[l-1]);
r++;
}
else
l++;
}
printf("%lld\n",ans);
return 0;
}