hdu 3642 Get The Treasury(扫描线、立方体交)

HDU---3642:Get The Treasury【立方体体积并】 题面: HDU---3642 题意: 简化一下,就是求N个立方体中重叠了3次及以上的体积和 分析: 类比于矩形面积并,我们以扫描面来切割立方体,只需计算出当前扫描面被覆盖了3次及以上的面积*相邻两个扫描面的高度差即可,不同于矩形面积并的做法的是:如果我们依然在线段树上记录每个扫描面的信息,那么必须要写二维线段树,这.....有点麻烦,由于N的范围不大,我们可以暴力找出包含了【当前扫描面的... 阅读详情


hdu 3642 Get The Treasury


和此题做对比

这个题相比之有不同的就是需要求覆盖两次以上部分的体积,而且不一定底面都是在xy平面上,但处理思路依然是一样的

主要问题是如果沿用上次求面积交的方法没办法处理处覆盖多次的情况,于是又回到了老办法上,没有多想先写下试试,结果没有超时,就这样了

不过还是要研究下更快的求面积交的算法,感觉挺重要


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
#define MAXN 2005
#define ll long long
#define lch p<<1
#define rch p<<1|1
#define mid (t[p].l+t[p].r)>>1
struct node
{
	int l,r;
	int cover;
	ll dy;
}t[MAXN<<2];
struct segment
{
	ll x,yd,yu;
	ll zd,zu;
	int lr;
	segment(){}
	segment(ll x,ll yd,ll yu,ll zd,ll zu,int lr):x(x),yd(yd),yu(yu),zd(zd),zu(zu),lr(lr){}
	bool operator < (const segment &a) const
	{
		return x<a.x;
	}
}seg[MAXN],tseg[MAXN];
ll yy[MAXN],zz[MAXN];
void construct(int l,int r,int p)
{
	t[p].l=l,t[p].r=r;
	t[p].cover=t[p].dy=0;
	if(l+1>=r) return ;
	int m=mid;
	construct(l,m,lch);
	construct(m,r,rch);
}
void modify(int l,int r,int op,int p)
{
	if(t[p].l==l&&t[p].r==r)
	{
		t[p].cover+=op;
		return ;
	}
	int m=mid;
	if(r<=m) modify(l,r,op,lch);
	else if(l>=m) modify(l,r,op,rch);
	else modify(l,m,op,lch),modify(m,r,op,rch);
}
void query(ll &ans,int p)
{
	if(t[p].cover>2)
	{
		ans+=yy[t[p].r]-yy[t[p].l];
	}
	else if(t[p].l+1<t[p].r)
	{
		t[lch].cover+=t[p].cover;
		t[rch].cover+=t[p].cover;
		query(ans,lch);
		query(ans,rch);
		t[lch].cover-=t[p].cover;
		t[rch].cover-=t[p].cover;
	}
}
map<ll,int> rec;
int main()
{
	int cas,n;
	ll x1,y1,z1,x2,y2,z2;
	scanf("%d",&cas);
	for(int kcas=1;kcas<=cas;kcas++)
	{
		scanf("%d",&n);
		int i;
		for(i=0;i<(n<<1);i+=2)
		{
			scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&x1,&y1,&z1,&x2,&y2,&z2);
			seg[i]=segment(x1,y1,y2,z1,z2,1);
			seg[i+1]=segment(x2,y1,y2,z1,z2,-1);
			yy[i]=y1,yy[i+1]=y2;
			zz[i]=z1,zz[i+1]=z2;
		}
		sort(seg,seg+i);
		sort(yy,yy+i);
		sort(zz,zz+i);
		int up=unique(yy,yy+i)-yy;
		int upz=unique(zz,zz+i)-zz;
		rec.clear();
		for(int i=0;i<up;i++)
			rec[yy[i]]=i;
		ll ans=0;
		for(int j=0;j<upz-1;j++)
		{
			ll area=0;
			int tn=0;
			for(int i=0;i<(n<<1);i++)
				if(seg[i].zd<=zz[j]&&seg[i].zu>=zz[j+1])
					tseg[tn++]=seg[i];
			if(tn==0) continue; 
			construct(0,up-1,1);
			for(int i=0;i<tn-1;i++)
			{
				modify(rec[tseg[i].yd],rec[tseg[i].yu],tseg[i].lr,1);
				ll tans=0;
				query(tans,1);
				area+=(tseg[i+1].x-tseg[i].x)*tans;
			}
			ans+=area*(zz[j+1]-zz[j]);
		}
		printf("Case %d: %I64d\n",kcas,ans);
	}
	return 0;
}



C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装 知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ... 阅读详情

相关推荐

应急响应靶场练习Linux-web-2

本次应急响应靶机采用的是知攻善防实验室的Linux-2应急响应靶机靶机下载地址为:相关账户密码: root/Inch@957821.(第一个为大写的i,记住要带最后的点.)1.该攻击者的IP为192.168.20.12.攻击方式应该是通过/index.php?user-app-register上传了一个webshell,然后使用蚁剑管理webshell之后再次上传version2.php进行提权.3.攻击者修改了phpmyadmin数据库的管理员密码。

tddkett的博客 2800

【hdu3642】Get The Treasury (立方体体积交+线段树+扫描线)

long long 是祖宗,祖宗,祖宗 orz

AFO 557

麒麟桌面操作系统QT开发环境搭建

麒麟操作系统安装Qt

因为热爱,所以坚持,记录工作中的乐趣 9271

HDU 3642 Get The Treasury (线段树、扫描线求立方体体积交)

给定n个立方体,求这些立方体覆盖两次以上的体积。 之前做过求矩形面积交的题,这题可以转化为求矩形面积交。先对y坐标和z坐标离散化,然后枚举每个z轴区间,求在该区间内矩形覆盖两次以上的面积,再乘以该区间宽度,即为该区间覆盖两次以上的体积。由于更新节点时有些地方没考虑好,TLE和WA了几次。 #include #include #include #include #include #in

~飞呀,飞~ 1329

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

产品经理如何运用AI提升工作效率

AI技术的应用为产品经理的工作流程带来了显著的效率提升。从需求收集到产品上线,AI可以在多个阶段提供智能化支持,帮助产品经理更好地理解用户需求、优化产品设计、提高开发和测试效率。在未来,随着AI技术的不断发展,产品经理将能够更加高效地管理产品生命周期,为用户提供更优质的产品体验。应用 | AI + 千行百业欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

不想宅的冷同学 1336

Get The Treasury HDU - 3642 扫描线 +体积交

一、内容 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 the earth. One day he got outside w...

Tizzi的博客 1104

2025年情感分析(SA)综述——论文阅读报告

2025年情感分析(SA)综述——论文阅读报告

Samdy_L的博客 2083

【HDU3642 Get The Treasury】线段树之扫描线(体积并)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 题目大意:给你n个立方体,求相交区域大于等于三次的体积和。 题目大意: 写这题之前我先做的hdu3255,有思路但是Wrong Answer到死。被逼无奈搜题解,都说是线段树扫描线求体积并,这之前我只会二维面积并。 其实吧,三维的和二维的其实差不多。...

baidui8622的博客 311

K型热电偶负电压采集难题?3种运放电路设计方案对比(含Multisim仿真)

本文针对K型热电偶在低温测量中产生的负电压采集难题,详细对比了三种运放电路设计方案,包括双电源运放反相放大、单电源仪表放大器和差分放大电路,并结合Multisim仿真数据分析了各方案的性能差异。文章还提供了PCB布局和抗干扰设计的实战技巧,帮助工程师解决热电偶信号采集中的核心挑战。

postgres8guard的博客 1017

【Zephyr电源与功耗专题】13_PMU电源驱动介绍

本文介绍的PMU芯片包含2路DCDC和6路LDO,在Zephyr实时操作系统下实现了完整的电源管理解决方案。

zero的博客 842

hdu 3642 Get The Treasury

线段树。 给你N个方体区域,求覆盖三次以上(包括三次)的区域的体积。 在sha崽的线段树扫描线分类。。。开始纠结了,这个三维咋转化成一维的呢。。给的坐标是蛮小的。有人说是枚举z坐标。。想了想。 因为之前的矩形面积交那个题,印象不是太深,又重新把那个题给看了。在那个题的基础上

小媛在努力~ 2687

Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)

Vue-高效简洁列表拖曳排序/鼠标拖动改变顺序排列组件支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无BUG列表拖曳排序插件vuedraggable拉动拽动拖动顺序改变排序js,vue.js,nuxt.js列表如何实现鼠标拖曳改变顺序排列支持滚动条内复杂数据对象带拖动效果动画排序完毕自动排列数组位置克隆Vue.Draggable官方文档教程SortableJS与vuedraggable列表拖动排序Vue拖拽组件库vuedraggable的安装与使用用户用鼠标拖动排序功能源码最好

🏆 前端领域优质创作者 4847

扫描线 体积交 -- Get The Treasury HDU - 3642

Get The Treasury HDU - 3642 题意: 求相交三次及以上的立方体体积。 思路: 由于z 最多只有1000层, 故我们可以直接对每一层求一次面积并。 但是求层数的时候有一个特别要注意的地方, 比如z包含 3 4 5这3层,算的时候我们求的是3层,实际上我们求体积只用求2层即可。故判断一下就行。这样若果只有一层 的话就不会算进去,因为一层构不成体积。 其他的就和基本的扫描线类似...

dajiangyou123456的博客 197

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU-3642 Get The Treasury

线段树+扫描线+离散化对立方体进行扫描,求出覆盖三次及以上的体积可以对Z轴离散化,然后在普通的扫描线算法外再套一层对Z轴的循环每次求出的二维面积乘以Z轴高度加起来就是要求的体积扫描线时用三个数组保存覆盖了一次,两次,三次的线段长度,还有cover数组保存区间覆盖次数更新函数详见代码#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt...

wl16wzl的博客 446

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HDU 3642 Get The Treasury(离散化+线段树:扫描线)

HDU 3642 Get The Treasury(离散化+线段树:扫描线) http://acm.hdu.edu.cn/showproblem.php?pid=3642 分析:        本题要求的是重叠3次及以上的立方体体积,由于Z轴范围很小,可以枚举Z轴,然后固定了Z轴之后,就是求二维矩形的面积交>=3次的总面积了.其实Z轴就算很大也可以求,只需要把Z轴离散化即可. 比如Z轴从小

code 1855

Get The Treasury HDU - 3642线段树+扫描线 解决立方体体积

求立方体三次重叠的体积 #include<iostream> #include<cstring> #include<string> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<stack> #inc...

仰望蓝天的博客 205

hdu3642 Get The Treasury

题意:给一些长方体,求这些长方体相交2次以上的体积 思路:在做过两维的之后做这个其实是一样的思路,先把z(第三维)处理了,然后在各个平面上面做扫描线(这里就和两维的一样了) #include #include #include #include #define LL __int64 using namespace std; const int maxn = 1010; struct haha{

u010485714的专栏 453

Get The Treasury HDU - 3642(线段树扫描线求体积交)

题意: 给若干个长方体,求出长方体至少相交三次的总体积; 分析:经典扫描线的题,z的范围不高于500,且只有1000个点,可以考虑在外层循环枚举z -500~500,也可以直接类似于扫描线一样,把z存在数组里, 每次算出来相交面积,ans+=z[i+1]-z[i]; AC代码 #include<bits/stdc++.h> using namespace std; typedef lo...

weixin_43670649的博客 213

HDU-3642-Get The Treasury(扫描线+线段树,三维)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 题目大意:给出一个三维坐标系,给出n个立方体,求被三个立方体覆盖的体积和。 思路:将z轴离散,平面扫描xy平面,对于每个类似3D打印,注意扫描的区间,不在[z,z+1]范围的立方体要移除扫描序列。 ACCode: #include<stdlib.h> #include&lt...

永远鲜红の幼月的博客 292

HDU 3642 Get The Treasury(线段树+扫描线求面积【再升级版(三维)】)

题目链接:HDU 3642 Get The Treasury 嘿嘿,早在做二维的时候我就猜到会有三维的~~~ 线段树+扫描线求面积 :1.基础版 (HDU 1542) 2.升级版 (HDU 1255) 如今遇到再次升级的版本心里小小的激动了一下 从HDU 1542 单纯求面积,到HDU 1255 求覆盖次数2次及以上的面积,到HDU 3642 求覆盖次数3次及以上的体积 体积的话,因为z

Must so 886

扫描线 n个立方体相交区域大于等于三次的体积和 hdu3642 Get The Treasury

题目链接   hdu3642  Get The Treasury 题目大意:题意:给你N个长方体的和坐标,问你空间中有多少体积是被大于两个不同的立方体覆盖的。 解题思路: 其实吧,三维的和二维的其实差不多。如果一个立方体的高为h,那么我们可以把它分割成h层,对每一层进行面积并的扫描,注意是从下往上。 这题离散化x坐标是为了方便建树,离散化z坐标是为了节约时间。 剩下的问题就变成了

ACM_10000h的专栏 784

hdoj 3642 Get The Treasury 【线段树 扫描线 求立方体积交】

Get The Treasury Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2341    Accepted Submission(s): 714 Problem Description Jack know

世界很大 661

hdu 3642 Get The Treasury(扫描线)

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

不慌不忙、不急不躁 1095

HDU - 3642 Get The Treasury —— 扫描线求体积

Get The Treasury Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3357    Accepted Submission(s): 1077   Problem Description Jack knows that ...

Lngxling的博客 291

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

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

Jinx Jinx again 1218

Get The Treasury【HDU-3642】【扫描线】

题目链接 题目给出的是N个体积块,问的是有多少体积重叠了3次及以上? 那么就是怎么处理体积这样子的问题了,看到Z的种类不多的时候,就想着从Z离散化的角度去考虑这个问题了,然后就是怎样子去处理面积了,这时候想到每一个Z所代表的这个面对应上的体积,然后把每个面都处理出来看,体积就是在处理X的和,以及求Y、Z的差(差分)来的乘积,所以在处理Z上的时候也有些细节的东西,就是我们要考虑到目前所访...

weixin_30519071的博客 116
上一篇: hdu 3255 Farming(扫描线、求立方体交)
下一篇: poj 3696 The Luckiest number(欧拉函数)
yjCola
博客等级 码龄14年 4粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值