AC 了,但是还有疑问
查看原帖
AC 了,但是还有疑问
554145
Night_sea_64楼主2023/9/2 17:46
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int n,sum;
int x1[100010],y1[100010],x2[100010],y2[100010];
int num[200010],cur,cur2;
struct line{int x,y1,y2,k;}a[200010];
bool operator<(const line &x,const line &y){
    return x.x<y.x;
}
struct segment_tree{int l,r,cnt,len,ans;}b[1600010];
void build(int x,int l,int r)
{
    b[x].l=l,b[x].r=r;
    if(l==r)
    {
        b[x].len=num[l+1]-num[l];
        return;
    }
    int mid=(l+r)/2;
    build(x*2,l,mid);
    build(x*2+1,mid+1,r);
    b[x].len=b[x*2].len+b[x*2+1].len;
}
void add(int x,int l,int r,int k)
{
    if(l>b[x].r||r<b[x].l)return;
    if(l<=b[x].l&&r>=b[x].r)
    {
        b[x].cnt+=k;
        if(!b[x].cnt)b[x].ans=b[x*2].ans+b[x*2+1].ans;
        else b[x].ans=b[x].len;
        return;
    }
    add(x*2,l,r,k);
    add(x*2+1,l,r,k);
    if(!b[x].cnt)b[x].ans=b[x*2].ans+b[x*2+1].ans;
    else b[x].ans=b[x].len;
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
        num[++cur]=y1[i],num[++cur]=y2[i];
    }
    sort(num+1,num+cur+1);
    for(int i=1;i<=n;i++)
    {
        y1[i]=lower_bound(num+1,num+cur+1,y1[i])-num;
        y2[i]=lower_bound(num+1,num+cur+1,y2[i])-num;
        a[++cur2]={x1[i],y1[i],y2[i],1};
        a[++cur2]={x2[i],y1[i],y2[i],-1};
    }
    build(1,1,cur-1);
    sort(a+1,a+cur2+1);
    for(int i=1;i<=cur2;i++)
    {
        if(i>1)sum+=b[1].ans*(a[i].x-a[i-1].x);
        add(1,a[i].y1,a[i].y2-1,a[i].k);
    }
    cout<<sum<<endl;
    return 0;
}

如果将 bb 数组开到 800010800010 过不了,是为什么?

2023/9/2 17:46
加载中...