提示好像是访问了无效的内存(Segmentation fault with invalid memory reference.),找了很久没找出来,把空间调大了也没用。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int SIZE=10010;
/*
是扫竖着的线段
*/
struct node{
ll xp,yb,ye,lg;
}Tr[SIZE<<3];//线段
ll dis[SIZE<<3];//离散化数组
ll ST[SIZE<<4],Lazy[SIZE<<4];//最值和标记
int T,n,W,H;
ll x,y,w;
bool cmp(node a,node b){
if(a.xp==b.xp)return a.lg>b.lg;
return a.xp<b.xp;
}
void _pushDown(int t){//下放标记
ll &lazy=Lazy[t];
if(0==lazy)return;
int ls=t<<1,rs=(t<<1)|1;
ST[ls]+=lazy;
ST[rs]+=lazy;
Lazy[ls]+=lazy;
Lazy[rs]+=lazy;
lazy=0;
}
void modify(int t,int s,int e,int a,int b,ll num){//将区间[a,b]加上num
if(a<=s&&e<=b){
ST[t]+=num;
Lazy[t]+=num;
return;
}
int mid=(s+e)>>1;
_pushDown(t);
if(a<=mid)modify(t<<1,s,mid,a,b,num);
if(mid<b)modify((t<<1)|1,mid+1,e,a,b,num);
ST[t]=max(ST[t<<1],ST[(t<<1)|1]);
}
int main(){
//freopen("Ain.txt","r",stdin);
//freopen("Aout.txt","w",stdout);
cin>>T;
while(T--){
memset(Tr,0,sizeof(Tr));
memset(ST,0,sizeof(ST));
memset(Lazy,0,sizeof(Lazy));
memset(dis,0,sizeof(dis));
cin>>n>>W>>H;
for(int i=1;i<=n;i++){
cin>>x>>y>>w;
dis[i]=y,dis[i+n]=y+H-1;
Tr[i].xp=x,Tr[i].yb=y,Tr[i].ye=y+H-1,Tr[i].lg=w;
Tr[i+n].xp=x+W-1,Tr[i+n].yb=y,Tr[i+n].ye=y+H-1,Tr[i+n].lg=-w;
}
ll ans=0;
sort(dis+1,dis+1+2*n);
int tot=unique(dis+1,dis+1+2*n)-(dis+1);
sort(Tr+1,Tr+1+2*n,cmp);
for(int i=1;i<=2*n;i++){
int u=lower_bound(dis+1,dis+1+2*n,Tr[i].yb)-(dis);
int v=lower_bound(dis+1,dis+1+2*n,Tr[i].ye)-(dis);
modify(1,1,tot,u,v,Tr[i].lg);
ans=max(ans,ST[1]);
}
cout<<ans<<endl;
}
}