萌新扫描线20pts求调
查看原帖
萌新扫描线20pts求调
536745
WaTleZero_pt楼主2023/10/13 12:15
#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,d;
struct Data{
    int val,hi,x,y;
}r[200010];
bool cmp(Data a,Data b){
    return a.hi>=b.hi;
}
class SegmentTree{
public:
    int cov[800010],qz[800010],val[800010],lay[800010];
    void Pushup(int u){
        if(cov[u]) val[u]=qz[u];
        else val[u]=val[u<<1]+val[u<<1|1];
    }
    void Build(int l,int r,int u,int *x){
        if(l==r){qz[u]=x[l];return;}
        int m=l+r>>1;
        Build(l,m,u<<1,x); Build(m+1,r,u<<1|1,x);
        Pushup(u); qz[u]=qz[u<<1]+qz[u<<1|1];
    }
    void Update(int l,int r,int tl,int tr,int u,int x){
        if(tl<=l&&r<=tr){
            cov[u]+=x; Pushup(u);
            //printf("%d %d %d %d %d\n",u,l,r,cov[u],val[u]);
            return;
        }
        int m=l+r>>1;
        if(tl<=m) Update(l,m,tl,tr,u<<1,x);
        if(m+1<=tr) Update(m+1,r,tl,tr,u<<1|1,x);
        //printf("%d %d *\n",u,cov[u]);
        Pushup(u);
    }
    int Query(){return val[1];}
}seg;
int val[200010],x[200010];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d%d",&a,&b,&c,&d);
        val[2*i-1]=b; val[2*i]=d;
        r[2*i-1]=(Data){-1,a,b,d};
        r[2*i]=(Data){1,c,b,d};
    }
    sort(val+1,val+2*n+1);
    int nwlen=unique(val+1,val+2*n+1)-val;
    for(int i=1;i<=2*n;i++){
        if(i>1) x[i-1]=val[i]-val[i-1];
        r[i].x=lower_bound(val+1,val+nwlen+1,r[i].x)-val;
        r[i].y=lower_bound(val+1,val+nwlen+1,r[i].y)-val-1;
    }
    int m=2*n-1;
    seg.Build(1,m,1,x);
    sort(r+1,r+2*n+1,cmp);
    long long ans=0;
    seg.Update(1,m,r[1].x,r[1].y,1,r[1].val);
    for(int i=2;i<=2*n;i++){
        //printf("%d\n",seg.Query()*(long long)(r[i-1].hi-r[i].hi));
        ans+=seg.Query()*(long long)(r[i-1].hi-r[i].hi);
        seg.Update(1,m,r[i].x,r[i].y,1,r[i].val);
    }
    printf("%lld",ans);
}

后来试了一下数组再开大4倍也没用

2023/10/13 12:15
加载中...