-
hdu3642题目链接 题意:给出若干个(1000)长方体,求至少交三次的空间的体积。 尺寸为[x1,x2],[y1,y2],[z1,z2],其中x,y的坐标的绝对值不超过1E6,Z的坐标的绝对值不超过1E9. 思路: 线段树+扫描线。 由于Z的坐标范围比较小,我们的做法是 利用“微分”的思想,将每个长方体,想成若干的高度为1的矩形(矩形片) 因此就转化成了求矩形至少交三次的面积 其中和矩形交,也就是矩形至少交2次的面积比较类似,只不过线段树多维护一个至少三次覆盖的长度的域。 void PushUp(int l,int r,int rt) { …
Read More -
题目链接 题意: 求矩形周长并。 思路: 线段树+扫描线。 和前面的求面积并比较类似,我们先考虑平行x轴的线段,考虑线段树,维护的一段区间中被矩形覆盖的次数cnt和至少覆盖一次的长度的len. 只不过我们这次求的是每条扫描线的长度对周长的贡献,因此不需要乘高度。 需要注意的是,每条扫描线对周长的贡献,是目前扫描线的长度,与上一次扫描线长度的差的绝对值。(不是与上一次答案的差的绝对值!) 演示x轴求长度和的部分 图片来自 lwt聚聚的博客 以及一个小细节是,求面积的时候,最后一条扫描线对答案是没有贡献的(因为每次是求当前扫描线与下一条扫描线之间的面积) 但是求周长的时候,最后一条扫描线是一定会对答案有贡献的。 /* …
Read More -
题目链接 题意: 求n(1000)个矩形的面积交,也就是至少有2个矩形覆盖的区域的面积。 思路: 和矩形面积并_hdu1542解题报告 类似 面积并问题中,线段树len维护的是至少覆盖一次的区域的长度 在面积交的问题中,我们需要多维护一个"至少覆盖两次的区域的长度"的域(设为double two;) 同时也要维护至少覆盖一次的区域的长度(设为double one;),是因为至少覆盖两次的区域的长度可以由至少覆盖一次的区域长度得到(好像是废话) PushUp的时候要格外注意当前节点被完整覆盖一次的情况。 此时tree[rt].two 可以由两个子区间的one的情况想加得到 (因为rt节点被完整覆盖了至少一次,那么 …
Read More -
hdu1542题目链接 题意: 求n(100)个矩形的面积并。 思路: 扫描线+线段树 题目是2000年中欧区域赛的题目,虽然年代久远,但是有好几个点还是很值得学习的。 首先是离散化的适用范围: 之前比较常用的是将比较大的整数值离散化,常常是因为数值太大无法作为下标。 那么其实,浮点数有的时候也需要进行离散化,比如作为数组的下标,比如用来枚举。 做法上是和将较大的整数值离散化没有区别,因为遇到的题目不多,所以特意记录一下。 第二点是扫描线的思想: 其实扫描线的思想很早就接触过,noip2011的时候,tyvj上有一道类似的题目,不过是一唯的,当时印象深刻的是@Ocean 兄的那个比喻: 一段公路上右很多区间要收不同的费用,区间的开始 …
Read More