hdu3642Get The Treasury

链接

刚开始看n挺小,以为是二维的线段树,想了一会也没想到怎么解,之后看到z值非常小,想到可以直接枚举z,确定一个坐标,然后把三维转化为二维,把体积转化为面。

枚举z从-500到500,然后用面积并的解法求出单位z坐标上满足题意的面积。

把1写成了L,查错查了好久。其余还好,1A。

求覆盖超过两次的面积,up更新上的写法如下:


void up(int w,int l,int r)
{
if(fs[w]>2)
{
s[w][0] = s[w][1] = s[w][2] = val[r+1] - val[l];
}
else if(fs[w]>1)
{
s[w][0] = s[w][1] = val[r+1]-val[l];
if(l==r)
s[w][2] = 0;
else s[w][2] = s[w<<1][0]+s[w<<1|1][0];
}
else if(fs[w])
{
s[w][0] = val[r+1]-val[l];
if(l==r)
s[w][1] = s[w][2] = 0;
else
{
s[w][2] = s[w<<1][1]+s[w<<1|1][1];
s[w][1] =s[w<<1][0]+s[w<<1|1][0];
}
}
else
{
if(l==r)
s[w][0] = s[w][1] = s[w][2] = 0;
else
{
s[w][0] = s[w<<1][0]+s[w<<1|1][0];
s[w][1] = s[w<<1][1]+s[w<<1|1][1];
s[w][2] = s[w<<1][2]+s[w<<1|1][2];
}
}
}

代码:

  1 #include <iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<stdlib.h>
6 #include<vector>
7 #include<cmath>
8 #include<queue>
9 #include<set>
10 #include<map>
11 using namespace std;
12 #define N 2010
13 #define LL __int64
14 #define INF 0xfffffff
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18 map<int,int>f;
19 struct node
20 {
21 int x1,x2,y,f;
22 int z1,z2;
23 node(){}
24 node(int x1,int x2,int y,int f,int z1,int z2):x1(x1),x2(x2),y(y),f(f),z1(z1),z2(z2){}
25 bool operator < (const node &S) const
26 {
27 return y<S.y;
28 }
29 }p[N],q[N];
30 int a[N],val[N];
31 int s[N<<2][3],fs[N<<2];
32 void up(int w,int l,int r)
33 {
34 if(fs[w]>2)
35 {
36 s[w][0] = s[w][1] = s[w][2] = val[r+1] - val[l];
37 }
38 else if(fs[w]>1)
39 {
40 s[w][0] = s[w][1] = val[r+1]-val[l];
41 if(l==r)
42 s[w][2] = 0;
43 else s[w][2] = s[w<<1][0]+s[w<<1|1][0];
44 }
45 else if(fs[w])
46 {
47 s[w][0] = val[r+1]-val[l];
48 if(l==r)
49 s[w][1] = s[w][2] = 0;
50 else
51 {
52 s[w][2] = s[w<<1][1]+s[w<<1|1][1];
53 s[w][1] =s[w<<1][0]+s[w<<1|1][0];
54 }
55 }
56 else
57 {
58 if(l==r)
59 s[w][0] = s[w][1] = s[w][2] = 0;
60 else
61 {
62 s[w][0] = s[w<<1][0]+s[w<<1|1][0];
63 s[w][1] = s[w<<1][1]+s[w<<1|1][1];
64 s[w][2] = s[w<<1][2]+s[w<<1|1][2];
65 }
66 }
67 }
68 void build(int l,int r,int w)
69 {
70 s[w][0] = s[w][1] = s[w][2] = 0;
71 fs[w] = 0;
72 if(l==r)
73 return ;
74 int m = (l+r)>>1;
75 build(l,m,w<<1);
76 build(m+1,r,w<<1|1);
77 up(w,l,r);
78 }
79 void update(int a,int b,int d,int l,int r,int w)
80 {
81 // cout<<l<<" "<<r<<" "<<w<<endl;
82 if(a<=l&&b>=r)
83 {
84 fs[w]+=d;
85 //cout<<l<<" "<<r<<" "<<fs[w]<<" "<<w<<endl;
86 up(w,l,r);
87 return ;
88 }
89 int m = (l+r)>>1;
90 if(a<=m) update(a,b,d,l,m,w<<1);
91 if(b>m) update(a,b,d,m+1,r,w<<1|1);
92 up(w,l,r);
93 }
94 int main()
95 {
96 int n,i,j;
97 int t,kk=0;
98 cin>>t;
99 while(t--)
100 {
101 scanf("%d",&n);
102 f.clear();
103 int g = 0;
104 for(i = 1 ;i <= n; i++)
105 {
106 int x1,x2,y1,y2,z1,z2;
107 scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
108 p[++g] = node(x1,x2,y1,1,z1,z2);
109 a[g] = x1;
110 p[++g] = node(x1,x2,y2,-1,z1,z2);
111 a[g] = x2;
112 }
113 sort(a+1,a+g+1);
114 sort(p+1,p+g+1);
115 int o = 0;
116 f[a[1]] = ++o;
117 val[1] = a[1];
118 for(i = 2; i <= g; i++)
119 if(a[i]!=a[i-1])
120 {
121 f[a[i]] = ++o;
122 val[o] = a[i];
123 }
124 LL ans = 0;
125 for(i = -500 ; i < 500 ; i++)
126 {
127 int e = 0;
128 build(1,o-1,1);
129 for(j = 1; j <= g ;j++)
130 {
131 if(p[j].z1>i||p[j].z1>i+1||i>p[j].z2||p[j].z2<i+1)
132 continue;
133 q[++e] = p[j];
134 }
135 for(j = 1; j < e; j++)
136 {
137 int l = f[q[j].x1];
138 int r = f[q[j].x2]-1;
139 // cout<<q[i].f<<" "<<i<<endl;
140 if(l<=r)
141 {
142 update(l,r,q[j].f,1,o-1,1);
143 }
144 LL sum = (LL)(q[j+1].y-q[j].y)*s[1][2];
145 //cout<<sum<<" ."<<i<<" "<<s[1][2]<<endl;
146 ans+=sum;
147 }
148 }
149 printf("Case %d: %I64d\n",++kk,ans);
150 }
151 return 0;
152 }

hdu3642Get The Treasury,布布扣,bubuko.com

时间: 2024-10-05 20:38:36

hdu3642Get The Treasury的相关文章

带你进入 SAP Treasury and Risk Management 世界

SAP Treasury and Risk Management是SAP财务的一个重要组成模块,但是在中国市场还未被客户广泛使用和推广,身为SAP Treasury and Risk Management技术支持的一员,我想我有责任和义务为它尽一份力,做一个广告! SAP Treasury and Risk Management是SAP为金融产品提供管理.风险分析.财务记账等功能的解决方案.我们知道,当今世界金融当先,每时每刻都有新的金融产品应运而生,世界各国的财务准则常常修改,几次金融危机也让

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 (三维的扫描线)

题目大意: 给出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 线段树+扫描线

反向标记是错的,要对矩形进行拆分 #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

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

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 - [加强版扫描线+线段树]

题目链接: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

Q - Get The Treasury - HDU 3642 (扫面线求体积)

题意:求被三个或三个以上立方体重合的体积 分析:就是平面面积的加强,不过归根还是一样的,可以把z轴按照从小向大分区间N个,然后可以得到N个平面,用平面重复三次以上的在和高度计算体积. ************************************************************************ #include<stdio.h>#include<algorithm>using namespace std; #define Lson r<<

HDU 3642 Get The Treasury (线段树扫描线)

题意:给你一些长方体,问你覆盖三次及以上的体积有多大 首先我们观察x轴y轴一样很大,但是z轴很小,所以我们可以枚举z轴(-500,500),注意我们枚举的是每一段长度为一的z轴的xy轴的面积而不是点.接着就是求在这一段内的矩形面积并的变形 注意我们要首先计算,再插入线段求面积并 #include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include&