覆盖的面积 HDU - 1255 (扫描线, 面积交)
求n个矩阵面积相交的部分,和求面积并一样,不过这里需要开两个数组保存覆盖一次和覆盖两次以上的次数的部分,还是模板,主要注意点就是pushup部分,如果我已经被两次覆盖,那我的两个数组在这个root点的宽度就可以直接算了,如果我被一次覆盖,那么我一个覆盖的部分可以直接计算,两次覆盖的部分取决于sum1数组,如果我不是一个线段,那就是0,如果我是一个线段,那么我就是由左边区间覆盖一次和右边区间覆盖一次相加得来。如果我这个区间现在没有被覆盖到,那么我的两个数组都是由各自部分的区间和得来的
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define first fi #define second se #define lowbit(x) (x & (-x))typedef unsigned long long int ull; typedef long long int ll; const double pi = 4.0*atan(1.0); const int inf = 0x3f3f3f3f; const int maxn = 2005; const int maxm = 305; using namespace std;int n, m, tol, T; struct Node{double l, r, h;int f;bool operator < (Node a) const {return h < a.h;} }; Node node[maxn]; double a[maxn]; int cnt[maxn << 2]; double sum1[maxn << 2]; double sum2[maxn << 2];void init() {memset(a, 0, sizeof a);memset(cnt, 0, sizeof cnt);memset(sum1, 0, sizeof sum1);memset(sum2, 0, sizeof sum2);memset(node, 0, sizeof node); }void pushup(int left, int right, int root) {if(cnt[root] >= 2) {sum2[root] = sum1[root] = a[right+1] - a[left];} else if(cnt[root] == 1) {sum1[root] = a[right+1] - a[left];if(left == right) sum2[root] = 0;else sum2[root] = sum1[root << 1] + sum1[root << 1 | 1];} else {if(left == right) sum1[root] = sum2[root] = 0;else {sum1[root] = sum1[root << 1] + sum1[root << 1 | 1];sum2[root] = sum2[root << 1] + sum2[root << 1 | 1];}} }void update(int left, int right, int prel, int prer, int val, int root) {if(prel <= left && right <= prer) {cnt[root] += val;pushup(left, right, root);return ;}int mid = (left + right) >> 1;if(prel <= mid) update(left, mid, prel, prer, val, root << 1);if(prer > mid) update(mid+1, right, prel, prer, val, root << 1 | 1);pushup(left, right, root);return ; }int main() {scanf("%d", &T);while(T--) {init();scanf("%d", &n);double x1, y1, x2, y2;for(int i=1; i<=n; i++) {scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);node[2*i].l = node[2*i-1].l = x1;node[2*i].r = node[2*i-1].r = x2;node[2*i].h = y1, node[2*i-1].h = y2;node[2*i].f = 1, node[2*i-1].f = -1;a[2*i] = x1, a[2*i-1] = x2;}n <<= 1;sort(node+1, node+1+n);sort(a+1, a+1+n);int nn = unique(a+1, a+1+n) - (a+1);double ans = 0.0;for(int i=1; i<n; i++) {int l = lower_bound(a+1, a+1+nn, node[i].l) - a;int r = lower_bound(a+1, a+1+nn, node[i].r) - a;update(1, nn, l, r-1, node[i].f, 1);ans += sum2[1] * (node[i+1].h - node[i].h);}printf("%.2f\n", ans);}return 0; }
View Code
转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9356978.html
覆盖的面积 HDU - 1255 (扫描线, 面积交)相关推荐
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- HDU 1255 覆盖的面积(线段树+扫描线)
题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...
- Python使用matplotlib可视化面积图(Area Chart)、通过给坐标轴和曲线之间的区域着色可视化面积图、在面积图的指定区域添加箭头和数值标签
Python使用matplotlib可视化面积图(Area Chart).通过给坐标轴和曲线之间的区域着色可视化面积图.在面积图的指定区域添加箭头和数值标签 目录
- Python使用matplotlib可视化时间序列堆叠的面积图、堆叠面积图给出了多个时间序列的贡献程度的可视化表示,以便于相互比较(Stacked Area Chart)
Python使用matplotlib可视化时间序列堆叠的面积图.堆叠面积图给出了多个时间序列的贡献程度的可视化表示,以便于相互比较(Stacked Area Chart) 目录
- leetcode最小面积_LeetCode—— 939. 最小面积矩形(JavaScript)
给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入:[[1,1],[1,3],[3,1],[3,3 ...
- c#求三角形面积周长公式_C#源代码—三角形面积、圆的面积
三角形面积.圆的面积 using System; using System.Collections.Generic; using System.Linq; using System.Text; nam ...
- php梯形评论,PHP梯形的上底.下底.高,点击计算面积按钮,输出梯形面积.
梯形的上底和下底不变,梯形的面积和高成什么比例,关系是怎么写 面积=1/2*(上底+下底)*高--高=2倍面积/(上底+下底) 梯形的上底和下底不变,梯形的面积和高成比例吗? 梯形面积=(上底+下底) ...
- Java黑皮书课后题第6章:6.35(几何:五边形的面积)五边形的面积可以用如下公式计算。编写一个方法,使用下面的方法头返回五边形面积。编写一个主方法,提示用户输入五边形的边,然后显示它的面积
6.35(几何:五边形的面积)五边形的面积可以用如下公式计算.编写一个方法,使用下面的方法头返回五边形面积.编写一个主方法,提示用户输入五边形的边,然后显示它的面积 题目 题目描述与运行示例 破题 代 ...
- 四边形面积等分以及多边形面积等分的讨论
:目前和软件无关,借此宝地发个日志. 四边形面积等分 百度上面的一个小题目, 没事就想想,喜欢喝点儿小酒而已. 想了几次,想出来了,记录如下 已知:凸多边形ABCD求做一直线将其面积等分 思路:三角形 ...
- 矩形面积周长和梯形面积
矩形梯形面积 矩形面积周长和梯形面积 创建一个Example1.java: public class Example1 { public static void main(String args[]) ...
最新文章
- 性能测试---商场模型分析
- 柚子的小小笔记本-Linux中的简单运算
- [LeetCode] NO.383 Ransom Note
- 教你如何成为数据科学家(六)
- 与年轻人“玩在一起”的QQ音乐,正抢跑音娱赛道?
- python 傅立叶函数_python 图像的离散傅立叶变换实例
- 分布式锁中的王者方案:Redisson
- android怎么让图片显示在button上面_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...
- mac无法充电解决办法!快来get下吧!
- 【必修】人工智能原理 学习笔记(二)chapter 2 产生式系统
- 如何在云服务器上部署程序
- flutter 可拖拽吸边的悬浮按钮,悬浮布局;
- 笔记本连不上苹果手机热点怎么回事
- [vue] transition animate.js
- 无线网关服务器搭建教程,【树莓派】简易LoRa网关搭建+服务器设置一条龙教程(the things network)...
- 网络协议-DNS与Hosts
- 捋一捋人工智能(AI)、机器学习(ML)、深度学习(DL)之间的关系
- 复赛了?“移动云杯”复赛模式开启!
- 拼图代码-两张图片拼接
- MyEclipse weblogic Deploy Location项目名称不正确解决方案