Farming HDU - 3255 线段树求立体几何

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leekerian/article/details/88784674

1a很舒服,

#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
#define ll long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1

const int MAXN=66666;
struct Line{
    ll l,r,h;
    int s;
    Line(ll _l,ll _r,ll _h,int _s)
    {
        l=_l;
        r=_r;
        h=_h;
        s=_s;
    }
    bool operator <(const struct Line &b)const{
        return h<b.h;
    }
};

struct node{
    ll x1,y1,x2,y2,s;
    node(ll _x1,ll _y1,ll _x2,ll _y2,ll _s)
    {
        x1=_x1;
        y1=_y1;
        x2=_x2;
        y2=_y2;
        s=_s;
    }
};

ll s[3];
vector<ll> vt1;
vector<Line> vt2;
vector<node> vt3;

ll sum[MAXN<<2];
int lazy[MAXN<<2];

void pushup(int l,int r,int rt)
{
    if(lazy[rt]) sum[rt]=vt1[r+1]-vt1[l];
    else if(l==r) sum[rt]=0;
    else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int L,int R,int c,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        lazy[rt]+=c;
        pushup(l,r,rt);
        return;
    }
    int mid=(l+r)>>1;
    if(L<=mid) update(L,R,c,lson);
    if(R>mid) update(L,R,c,rson);
    pushup(l,r,rt);
}
int main()
{
    int t;
    cin>>t;
    int kace=1;
    while(t--)
    {
        vt3.clear();
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
            scanf("%lld",&s[i]);
        for(int i=0;i<n;i++)
        {
            ll x1,y1,x2,y2;
            int k;
            scanf("%lld%lld%lld%lld%d",&x1,&y1,&x2,&y2,&k);
            vt3.push_back(node(x1,y1,x2,y2,s[k-1]));
        }
        sort(s,s+m);
        ll ans1=0;
        int cur=0;
        for(int i=0;i<m;i++)
        {
            vt1.clear();
            vt2.clear();
            for(int j=0;j<n;j++)
            {
                if(vt3[j].s>=s[i])
                {
                    vt1.push_back(vt3[j].x1);
                    vt1.push_back(vt3[j].x2);
                    vt2.push_back(Line(vt3[j].x1,vt3[j].x2,vt3[j].y1,1));
                    vt2.push_back(Line(vt3[j].x1,vt3[j].x2,vt3[j].y2,-1));
                }
            }
            sort(vt1.begin(),vt1.end());
            sort(vt2.begin(),vt2.end());
            vt1.erase(unique(vt1.begin(),vt1.end()),vt1.end());
            memset(sum,0,sizeof(sum));
            memset(lazy,0,sizeof(lazy));
            ll ans=0;
            for(int z=0;z<vt2.size()-1;z++)
            {
                int l=lower_bound(vt1.begin(),vt1.end(),vt2[z].l)-vt1.begin();
                int r=lower_bound(vt1.begin(),vt1.end(),vt2[z].r)-vt1.begin()-1;
                update(l,r,vt2[z].s,0,vt1.size()-1,1);
                ans+=sum[1]*(vt2[z+1].h-vt2[z].h);
            }
            ans1+=ans*(s[i]-cur);
            cur=s[i];
        }
        printf("Case %d: %lld\n",kace++,ans1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/leekerian/article/details/88784674