hdu 3642 体积并

题意:求三个矩形体积的并

链接:点我

枚举z

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<algorithm>
  6 #include<vector>
  7 #include<math.h>
  8 #include<map>
  9 #pragma comment(linker, "/STACK:1024000000,1024000000")
 10 using namespace std;
 11 #define maxn 1100
 12 #define mem(a,b) (memset(a),b,sizeof(a))
 13 #define lmin 1
 14 #define rmax len
 15 #define lson l,(l+r)/2,rt<<1
 16 #define rson (l+r)/2+1,r,rt<<1|1
 17 #define root lmin,rmax,1
 18 #define now l,r,rt
 19 #define int_now int l,int r,int rt
 20 #define INF 99999999
 21 #define LL long long
 22 #define mod 10007
 23 #define eps 1e-6
 24 #define zero(x) (fabs(x)<eps?0:x)
 25 #define LL __int64
 26 map<int,int>mp;
 27 int du[maxn*2];
 28 struct lines
 29 {
 30     int x;
 31     int y,yy;
 32     int z,zz;
 33     int leap;
 34     friend bool operator <(const lines &a,const lines &b)
 35     {
 36         return a.x<b.x;
 37     }
 38 } line[maxn*2];
 39 int num[maxn*4*2];
 40 int sum[maxn*4*2];
 41 int kum[maxn*4*2];
 42 int cover[maxn*4*2];
 43 void push_down(int_now)
 44 {
 45
 46 }
 47 void push_up(int_now)
 48 {
 49     int len=du[r+1]-du[l];
 50     if(cover[rt]==0)
 51     {
 52         num[rt]=num[rt<<1]+num[rt<<1|1];
 53         sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 54         kum[rt]=kum[rt<<1]+kum[rt<<1|1];
 55     }
 56     if(cover[rt]==1)
 57     {
 58         num[rt]=len;
 59         sum[rt]=num[rt<<1]+num[rt<<1|1];
 60         kum[rt]=sum[rt<<1]+sum[rt<<1|1];
 61     }
 62     if(cover[rt]==2)
 63     {
 64         num[rt]=len;
 65         sum[rt]=len;
 66         kum[rt]=num[rt<<1]+num[rt<<1|1];
 67     }
 68     if(cover[rt]>=3)
 69     {
 70         num[rt]=len;
 71         sum[rt]=len;
 72         kum[rt]=len;
 73     }
 74 }
 75 void creat()
 76 {
 77     memset(cover,0,sizeof(cover));
 78     memset(num,0,sizeof(num));
 79     memset(sum,0,sizeof(sum));
 80     memset(kum,0,sizeof(kum));
 81 }
 82 void updata(int ll,int rr,int x,int_now)
 83 {
 84     if(ll>r||rr<l)return;
 85     if(ll<=l&&rr>=r)
 86     {
 87         cover[rt]+=x;
 88         push_up(now);
 89         return;
 90     }
 91     updata(ll,rr,x,lson);
 92     updata(ll,rr,x,rson);
 93     push_up(now);
 94 }
 95 int main()
 96 {
 97     int T,cas;
 98     scanf("%d",&T);
 99     cas=0;
100     while(T--)
101     {
102         cas++;
103         int n,x,y,z,xx,yy,zz;
104         mp.clear();
105         scanf("%d",&n);
106         LL ls=1;
107         du[0]=-1000010;
108         for(int i=1; i<=n; i++)
109         {
110             scanf("%d%d%d%d%d%d",&x,&y,&z,&xx,&yy,&zz);
111             line[i*2-1].x=x;
112             line[i*2-1].y=y;
113             line[i*2-1].yy=yy;
114             line[i*2-1].z=z;
115             line[i*2-1].zz=zz;
116             line[i*2-1].leap=1;
117             line[i*2].x=xx;
118             line[i*2].y=y;
119             line[i*2].yy=yy;
120             line[i*2].z=z;
121             line[i*2].zz=zz;
122             line[i*2].leap=-1;
123             du[ls++]=y;
124             du[ls++]=yy;
125         }
126         sort(line+1,line+n*2+1);
127         sort(du+1,du+ls);
128         int len=1;
129         for(int i=1; i<ls; i++)
130         {
131             if(du[i]!=du[i-1])
132             {
133                 mp[du[i]]=len;
134                 du[len++]=du[i];
135             }
136         }
137         len-=2;
138         LL are=0;
139         int st=0;
140         creat();
141         for(int j=-501; j<501; j++)
142         {
143             st=0;
144             for(int i=1; i<=n*2; i++)
145             {
146                 int l,r;
147                 l=mp[line[i].y];
148                 r=mp[line[i].yy];
149                 if(line[i].z>j||line[i].zz<=j)continue;
150                 LL x,y;
151                 x=(LL)kum[1];
152                 y=(LL)line[i].x-st;
153                 are+=x*y;
154                 updata(l,r-1,line[i].leap,root);
155                 st=line[i].x;
156             }
157         }
158         printf("Case %d: %I64d\n",cas,are);
159     }
160     return 0;
161 }
时间: 2024-11-10 00:09:38

hdu 3642 体积并的相关文章

HDU 3642 线段树+离散化+扫描线

题意:给你N个长方体的左下角和右上角坐标,问你空间中有多少体积是被大于两个不同的立方体覆盖的.x,y~10^6 z~500 考虑到给的z比较小,所以可以直接枚举z,然后跑二维的扫描线就好. 关于处理被不同的线段覆盖三次的问题,可以维护四个信息,cnt,once,twice,more,然后相互推出结果就好. #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #

hdu 3642 Get The Treasury (三维的扫描线)

题目大意: 给出N个立方体. 求一个三维空间中被包围三次的空间的体积之和. 思路分析: 发现Z的范围很小.那么我们可以枚举Z轴,然后对 x y做扫描线. 而且不用枚举所有的Z ,只需要将Z离散化之后枚举. #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #define maxn 2222 #define debug puts("fuck!&q

hdu 3642 Get The Treasury(扫描线)

题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次以上. 解题思路:扫描线,将第三维分离出来,就是普通的二维扫描线,然后对于每个节点要维护覆盖0,1,2,3以上这4种的覆盖面积. #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const

HDU 3642 Get The Treasury 线段树+扫描线

反向标记是错的,要对矩形进行拆分 #include <cstdio> #include <algorithm> #include <cstring> #include <vector> typedef long long LL; using namespace std; #define lson rt << 1,l,mid #define rson rt << 1 | 1,mid + 1,r const int maxn = 5e4

HDU 3642 Get The Treasury(线段树)

HDU 3642 Get The Treasury 题目链接 题意:给定一些立方体,求体积重叠超过3次的 思路:由于z坐标只有500,那么就可以枚举z坐标,每次做x,y的面积并即可,用线段树维护 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1005; const int INF = 0x3f3f3f3f; typedef

HDU 3642 扫描线(立方体体积并)

Get The Treasury Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2190    Accepted Submission(s): 669 Problem Description Jack knows that there is a great underground treasury in a secret region

Get The Treasury HDU - 3642(体积扫描线)

给出n个立方体,要你求这些立方体至少被覆盖三次的部分. 先把这个立方体的信息存在来,发现Z的范围不大,z范围是是[-500,500],所以我们可以先离散化,然后枚举Z, 然后对于每一段Z的区域内,在当前的区域内对xoy轴使用一次扫描线,找到当前这个区域内被覆盖三次的体积,然后每次枚举Z,每次相加,就是最后的答案. #include<map> #include<set> #include<ctime> #include<cmath> #include<s

HDU 3642 - Get The Treasury - [加强版扫描线+线段树]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description Jack knows that there is a great underground treasury in a secret region. And he has a special d

HDU 3642 求体积交集

Get The Treasury 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3642 Problem Description Jack knows that there is a great underground treasury in a secret region. And he has a special device that can be used to detect treasury under the surface of th