用一条扫描线扫过去,数据也是弱的爆,只是留意一下边界的处理就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 10050
using namespace std;
int n,r,edg[maxn],t[5020];
struct node{
int x,y,w;
bool operator<(const node& b)const{return x==b.x?y>b.y:x<b.x;}
}nod[maxn];
int main(){
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&nod[i].x,&nod[i].y,&nod[i].w);
}
sort(nod+1,nod+1+n);
int l=1,len=nod[1].x;
int ans=0;
for(int i=1;i<=n;){
len=nod[i].x;
while(nod[i].x==len&&i<=n){
edg[nod[i].y]+=nod[i].w;
i++;
}
while(nod[l].x<=len-r&&l<i){
edg[nod[l].y]-=nod[l].w;
l++;
}
memset(t,0,sizeof(t));
for(int j=0;j<r-1;j++)j==0?t[j]=edg[j]:t[j]=t[j-1]+edg[j];
for(int j=r-1;j<=5000;j++){
j==0?t[j]=edg[j]:t[j]=t[j-1]+edg[j];
ans=max(ans,t[j]-t[j-r]);
}
}
printf("%d",ans);
return 0;
}