覆盖的面积扫描线

2024-03-08 10:58
文章标签 覆盖 面积 扫描线

本文主要是介绍覆盖的面积扫描线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//魔改线段树的做法,想了好久注意是那个一次用len记录,两次用length来计数
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=2*1010;
struct tree{double l,r,len,length;int lazy,vis;
}t[maxn<<3];
double val[maxn];
int vis[maxn<<3];
struct node{double x,y1,y2;int flag;bool operator<(node a) const{return x<a.x;}
}p[maxn];//扫描线 
void build(int p,int l,int r)//浮点数 
{t[p].l=val[l],t[p].r=val[r];if(r-l<=1){vis[p]=1;//结束的标志 return;}int mid=l+r>>1;build(p<<1,l,mid);build(p<<1|1,mid,r);
}
void spread(int p)
{if(t[p].lazy>=2)	{t[p].length=t[p].r-t[p].l;//一次的长度为0 t[p].len=0;}else if(t[p].lazy==1)	{if(vis[p])t[p].len=t[p].r-t[p].l,t[p].length=0;//如果是最后的边的话他就是直接一次的长度为r-l,加上一个为0,防止最后一个从2变为1后会有变化 double all=t[p].r-t[p].l;t[p].length=t[p<<1].length+t[p<<1|1].length+t[p<<1].len+t[p<<1|1].len;//两次的长度为原本下方的两次和一次t[p].len=all-t[p].length;	}else {t[p].len=t[p<<1].len+t[p<<1|1].len;t[p].length=t[p<<1].length+t[p<<1|1].length;//这里不需要考虑到最后的时候下标越界,因为最后一个有放回的时候 } 
}
void modify(int p,double l,double r,int w)
{if(t[p].l>=l&&t[p].r<=r){t[p].lazy+=w;spread(p);return;}if(t[p<<1].r>l)//注意没有等号的话会死循环 modify(p<<1,l,r,w);if(t[p<<1|1].l<r)modify(p<<1|1,l,r,w);spread(p);
}
int main(){int T,n;scanf("%d",&T);for(int i=1;i<=T;i++){int cnt=0;double ans=0;memset(val,0,sizeof val);memset(t,0,sizeof t);memset(p,0,sizeof p);memset(vis,0,sizeof vis);scanf("%d",&n);double x1,y1,x2,y2;for(int j=1;j<=n;j++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);p[j*2-1]=(node){x1,y1,y2,1};p[j*2]=(node){x2,y1,y2,-1};val[++cnt]=y1,val[++cnt]=y2; }sort(val+1,val+1+cnt);sort(p+1,p+1+cnt);build(1,1,cnt);for(int j=1;j<cnt;j++){modify(1,p[j].y1,p[j].y2,p[j].flag);
//			for(int k=1;k<=31;k++)
//				cout<<k<<"  aaa "<<t[k].l<<"   "<<t[k].r<<"  "<<t[k].lazy<<"  "<<t[k].len<<endl;ans+=(p[j+1].x-p[j].x)*t[1].length; }printf("%.2f\n",ans);}return 0;
}

这篇关于覆盖的面积扫描线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786863

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo

Minimal coverage -uva 覆盖线段,贪心

一道经典的贪心问题,具体方法就是将(an,bn)区间,按照an从小到大的顺序进行排序,之后从0开始, 取最大的有效区间,这里用到了结构体的快排,否则可能会超时. #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 100000 + 10#define BOTTOM -50000 - 10str

利用向量积(叉积)计算三角形的面积和多边形的面积(hdu2036)

开始撸计算几何题目了。。。。。。。 预备知识:叉乘求多边形面积 参考证明资料: 公式证明: http://www.cnblogs.com/xiexinxinlove/p/3708147.html 高中知识: http://wenku.baidu.com/view/867e6edfad51f01dc281f11a.html #include<stdio.h>#inclu

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些

HDU 2036 求多边形面积

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2036 对用(按逆时针排列)描述的多边形,其面积为: 若按顺时针排列,取负数即可。 资料链接: http://zh.wikipedia.org/wiki/%E5%A4%9A%E8%BE%B9%E5%BD%A2 不知道这公式是咋推导的,网上找不到,先留着。 #

过滤器:覆盖过滤器如何在凝结水处理系统中应用

本文介绍了覆盖过滤器的基本原理,阐述了覆盖过滤器处理凝结水中悬浮物和胶体的工艺流程及铺膜、过滤、爆膜等环节的操作规范。指出覆盖过滤器在运行中存在铺不上膜、铺膜不匀、脱膜等常见的故障并提出处理方法。   0·引言   凝结水处理系统设置覆盖过滤器的目的是除去凝结水中的金属腐蚀物及油类等杂质。这些杂质通常为悬浮颗粒和胶体,如果不被滤除,会污染离子交换树脂,反冲洗过滤器原理使其交换量下降,工作周