萌新求助,RE了三个
查看原帖
萌新求助,RE了三个
598983
Pan1楼主2023/3/6 21:14

P1502

提示好像是访问了无效的内存(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;
        
    }
}
2023/3/6 21:14
加载中...