#include <bits/stdc++.h>
#define N 200010
#define int long long
using namespace std;
int n,cnt,s,w;
int x[N<<1],y[N<<1],cntx,cnty;
int ans;
struct node
{
double x1,y1,x2,y2;
int val;
#define x1(x) rec[x].x1
#define x2(x) rec[x].x2
#define y1(x) rec[x].y1
#define y2(x) rec[x].y2
#define val(x) rec[x].val
}rec[N];
struct node2
{
int x,y1,y2,val;
}seg[N<<1];
struct st
{
int l,r,mx,tag;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define mx(x) tree[x].mx
#define tag(x) tree[x].tag
}tree[N<<4];
bool cmp(node2 a,node2 b)
{
return a.x<b.x;
}
void build(int p,int l,int r)
{
l(p)=l;r(p)=r;
if (l==r)
return;
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void pushdown(int p)
{
mx(p<<1)+=tag(p);
mx(p<<1|1)+=tag(p);
tag(p<<1)+=tag(p);
tag(p<<1|1)+=tag(p);
tag(p)=0;
}
void add(int p,int l,int r,int val)
{
if ((l<=l(p)) && (r(p)<=r))
{
mx(p)+=val;
tag(p)+=val;
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if (l<=mid) add(p<<1,l,r,val);
if (mid<r) add(p<<1|1,l,r,val);
mx(p)=max(mx(p<<1),mx(p<<1|1));
}
int query(int p,int l,int r)
{
if ((l<=l(p)) && (r(p)<=r))
return mx(p);
int mid=(l(p)+r(p))>>1;
int mx=0;
if (l<=mid) mx=max(query(p<<1,l,r),mx);
if (mid<r) mx=max(query(p<<1|1,l,r),mx);
return mx;
}
signed main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%lld %lld %lld",&n,&s,&w);
s++;
for (int i=1;i<=n;i++)
{
int a,b,vl;
scanf("%lld %lld %lld",&a,&b,&vl);
x1(i)=a;
x2(i)=a+s-1;
y1(i)=b;
y2(i)=b+w-1;
val(i)=vl;
x[++cntx]=x1(i);
x[++cntx]=x2(i);
y[++cnty]=y1(i);
y[++cnty]=y2(i);
}
sort(x+1,x+cntx+1);
sort(y+1,y+cnty+1);
cntx=unique(x+1,x+cntx+1)-(x+1);
cnty=unique(y+1,y+cnty+1)-(y+1);
for (int i=1;i<=n;i++)
{
x1(i)=lower_bound(x+1,x+cntx+1,x1(i))-x;
x2(i)=lower_bound(x+1,x+cntx+1,x2(i))-x;
y1(i)=lower_bound(y+1,y+cnty+1,y1(i))-y;
y2(i)=lower_bound(y+1,y+cnty+1,y2(i))-y;
seg[++cnt].x=x1(i);
seg[cnt].y1=y1(i);
seg[cnt].y2=y2(i);
seg[cnt].val=val(i);
seg[++cnt].x=x2(i);
seg[cnt].y1=y1(i);
seg[cnt].y2=y2(i);
seg[cnt].val=-val(i);
}
sort(seg+1,seg+cnt+1,cmp);
int q=1;
build(1,1,cnty);
while(q<=cnt)
{
add(1,seg[q].y1,seg[q].y2,seg[q].val);
while (seg[q+1].x==seg[q].x)
{
q++;
add(1,seg[q].y1,seg[q].y2,seg[q].val);
}
ans=max(ans,query(1,1,cnty));
q++;
}
printf("%lld\n",ans);
cnt=cntx=cnty=ans=0;
for (int i=1;i<=(n<<3);i++)
l(i)=r(i)=tag(i)=mx(i)=0;
}
return 0;
}
开了O2的提交记录
没开的
不知道为啥,就很谜