排序以后O(n)枚举尾部。头部单调,维护一下就好。
#include<bits/stdc++.h> using namespace std; typedef long long ll; //#define LOCAL const int maxn = 1e5+5; struct Node { int m,s; void IN(){ scanf("%d%d",&m,&s); } bool operator < (const Node&rh) const { return m < rh.m; } }nd[maxn]; ll ss[maxn]; int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif int n,d; scanf("%d%d",&n,&d); for(int i = 1; i <= n; i++){ nd[i].IN(); } sort(nd+1,nd+1+n); for(int i = 1; i <= n; i++){ ss[i] = ss[i-1]+nd[i].s; } ll ans = 0; for(int i = 1,j = 1; i <= n; i++){ while(j<n && nd[j+1].m - nd[i].m < d) j++; ans = max(ans,ss[j]-ss[i-1]); } printf("%I64d",ans); return 0; }
时间: 2024-12-28 21:06:07