HDU 3642 Get The Treasury

来源:互联网 发布:企业网络宣传语 编辑:程序博客网 时间:2024/06/06 17:04
//g++ AC 在两个int型变量进行乘法时,为了防止溢出,请使用(LL)强制类型转换//HDU 请使用__int64/* 注意到z这一维的坐标范围较小,可以考虑直接离散化z的坐标之后进行枚举,对x,y平面内进行普通的线段树矩形求交即可. 另外,在计算覆盖三次的面积的时候,sum1代表只覆盖一次的线段长度,sum2代表只覆盖两次的线段长度,sum3代表只覆盖了三次以及以上的线段长度. 这样在pushup()函数书写方便 */#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;#define LL long longconst int maxn = 2222;struct edge{    int a,b,h;    int s;};struct cube{    int x1,y1,z1,x2,y2,z2;};cube c[maxn];edge e[maxn];bool cmp(const edge &p,const edge &q){    if(p.h==q.h)  return p.s<q.s;    return p.h<q.h;}int x[maxn];int z[maxn];int lazy[maxn<<2];int sum1[maxn<<2];int sum2[maxn<<2];int sum3[maxn<<2];int n,m,p;int kase;void pushup(int l,int r,int rt){    int lc=rt<<1;    int rc=rt<<1|1;    if(lazy[rt]<=-3)    {        sum3[rt]=x[r+1]-x[l];        sum2[rt]=sum1[rt]=0;    }else  if(lazy[rt]==-2)    {        sum3[rt]=sum3[lc]+sum3[rc]+sum2[lc]+sum2[rc]+sum1[lc]+sum1[rc];        sum2[rt]=x[r+1]-x[l]-sum3[rt];        sum1[rt]=0;    }else  if(lazy[rt]==-1)    {        sum3[rt]=sum2[lc]+sum2[rc]+sum3[lc]+sum3[rc];        sum2[rt]=sum1[lc]+sum1[rc];        sum1[rt]=x[r+1]-x[l]-sum2[rt]-sum3[rt];    }else  if(l==r)    {        sum3[rt]=sum2[rt]=sum1[rt]=0;    }else    {        sum3[rt]=sum3[lc]+sum3[rc];        sum2[rt]=sum2[lc]+sum2[rc];        sum1[rt]=sum1[lc]+sum1[rc];    }}void update(int L,int R,int s,int l,int r,int rt){    if(L<=l&&r<=R)    {        lazy[rt]+=s;        pushup(l,r,rt);        return;    }    int mid=(l+r)>>1;    if(L<=mid)  update(L,R,s,l,mid,rt<<1);    if(R>mid)  update(L,R,s,mid+1,r,rt<<1|1);    pushup(l,r,rt);}int bst(int v,int x[],int size){    int mid;    int l,r;    l=0,r=size-1;    while(l<=r)    {        mid=(l+r)>>1;        if(x[mid]==v)  return mid;        if(x[mid]<v)  l=mid+1;        else  r=mid-1;    }    return -1;}void input(){    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d%d%d%d%d%d",&c[i].x1,&c[i].y1,&c[i].z1,&c[i].x2,&c[i].y2,&c[i].z2);    }    //printf("%d\n",n);}void add_rectangel(int x1,int y1,int x2,int y2){    x[m]=x1;    e[m].a=x1,e[m].b=x2,e[m].h=y1,e[m++].s=-1;    x[m]=x2;    e[m].a=x1,e[m].b=x2,e[m].h=y2,e[m++].s=1;}void solve(){    if(n<3)    {        printf("Case %d: 0\n",kase++);        return;    }    LL ans=0;    int cnt;    for(int i=0;i<n;i++)    {        z[2*i]=c[i].z1;        z[2*i+1]=c[i].z2;    }    sort(z,z+2*n);    for(int i=0;i+1<2*n;i++)    {        memset(lazy,0,sizeof(lazy));        memset(sum1,0,sizeof(sum1));        memset(sum2,0,sizeof(sum2));        memset(sum3,0,sizeof(sum3));        m=0;        LL res=0;        for(int j=0;j<n;j++)        {            if(c[j].z1<=z[i]&&z[i]<c[j].z2)            {                add_rectangel(c[j].x1,c[j].y1,c[j].x2,c[j].y2);            }        }        cnt=1;        for(int i=1;i<m;i++)        {            if(x[i]!=x[i-1])  x[cnt++]=x[i];        }        sort(e,e+m,cmp);        sort(x,x+cnt);        int L,R;        for(int i=0;i+1<m;i++)        {            L=bst(e[i].a,x,cnt);            R=bst(e[i].b,x,cnt)-1;            if(L<=R)            {                update(L,R,e[i].s,0,cnt-1,1);                res+=(LL)sum3[1]*(e[i+1].h-e[i].h);            }        }        res*=z[i+1]-z[i];        ans+=res;    }    printf("Case %d: %lld\n",kase++,ans);}int main(){    int T;    scanf("%d",&T);    //printf("%d\n",T);    kase=1;    while(T--)    {        input();        solve();    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑网络用户名忘了连不上网怎么办 微博忘记登录名怎么办只记得昵称 买房子付了首付现在要退房怎么办 玩lol延迟高怎么办但网速没问题 中维世纪监控密码忘记了怎么办 原店主营业执照不注销怎么办新的 苹果手机铃声调到最大还小怎么办 投标时措施费忘记套价了怎么办 美团商家更改手机号和银行卡怎么办 淘宝买的衣服颜色发错了怎么办 在淘宝买的衣服颜色不一样怎么办 新买的木柜气味好重怎么办 淘宝店铺动态评分一直很低怎么办? 刚生下来的宝宝睡觉不吃奶怎么办 宝宝吐奶咳嗽了可能被呛到怎么办 床下面的液压支架支撑不了了怎么办 沙发的海绵垫坐着感觉太硬怎么办 修公路占地补偿盖房子房产证怎么办 哺乳期乳房有硬块挤不出来怎么办 老公投的公司倒闭了钱怎么办 小丑鱼老在缸上边游不下去怎么办 海缸养珊瑚又想养蝴蝶鱼怎么办 被几个月的小狗咬了怎么办 木本植物继代长出大量愈伤怎么办 钱兜树叶子发黄掉叶怎么办 手机qq群200人满了怎么办 支票被背书人的章盖浅了怎么办 没病装病的心理病患者怎么办 20多岁被骗40多万怎么办 一个学生上课爱捣乱班级课堂怎么办 军训的时候大姨妈来了怎么办 笔记本连接无线网说链接限制怎么办 12306密码和邮箱都忘了怎么办 烦恼都是自找的新书散页了怎么办 白色衣服被红色衣服染了怎么办 手机微信里面不能拍手功怎么办 肇事逃逸轻伤且对方不私了怎么办 数学差怎么办脑子不好啊数学学不老 手机号丢失微信密码丢失怎么办找回 悦借钱输入五次密码被锁怎么办 生源地助学贷款密码忘了怎么办