O - 覆盖的面积(线段树+扫描线)
Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000.
注意:本题的输入数据较多,推荐使用scanf读入数据.
Output对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.
Sample Input
2
5
1 1 4 2
1 3 3 7
2 1.5 5 4.5
3.5 1.25 7.5 4
6 3 10 7
3
0 0 1 1
1 0 2 1
2 0 3 1
Sample Output
7.63
0.00
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
double sum1[maxn<<],sum2[maxn<<],area;
double x[maxn<<];
int cnt[maxn<<];
int t,n,top1,top2;
struct node
{
double l,r,h;//一条边的信息:左端点的横坐标,右端点的横坐标,高度(即纵坐标)
int d; //标记:为1代表为一个矩形的下边,-1为上边
bool operator < (const node&a)const//按高度从小到大排序
{
return h<a.h;
}
} line[maxn<<];
void pushup(int l,int r,int rt)
{
if(cnt[rt])
sum1[rt]=x[r+]-x[l];
else if(l==r) //一定要加上~
sum1[rt]=;
else
sum1[rt]=sum1[rt*]+sum1[rt*+];
if(cnt[rt]>=)
sum2[rt]=x[r+]-x[l];
else if(l==r) //这个也一定要加上
sum2[rt]=;
else if(cnt[rt]==)
sum2[rt]=sum1[rt*]+sum1[rt*+];
else if(cnt[rt]==)
sum2[rt]=sum2[rt*]+sum2[rt*+];
}
void update(int L,int R,int v,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
cnt[rt]+=v;
pushup(l,r,rt);
return ;
}
int mid=(l+r)/;
if(L<=mid)
update(L,R,v,l,mid,rt*);
if(R>=mid+)
update(L,R,v,mid+,r,rt*+);
pushup(l,r,rt);
}
void Init()
{
memset(sum1,,sizeof(sum1));
memset(sum2,,sizeof(sum2));
memset(cnt,,sizeof(cnt));
top1=,top2=,area=;
}
int main()
{
scanf("%d",&t);
while(t--)
{
Init();
scanf("%d",&n);
for(int i=; i<=n; i++)
{
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1, &y1, &x2,&y2);
x[++top1]=x1;
x[++top1]=x2;
line[++top2]=(node)
{
x1,x2,y1,
};//记录下边
line[++top2]=(node)
{
x1,x2,y2,-
};//记录上边
}
sort(x+,x++top1);
sort(line+,line++top2);
int k=unique(x+,x++top1)-x-;
for(int i=; i<top2; i++)
{
int L=lower_bound(x+,x++k,line[i].l)-x;
int R=lower_bound(x+,x++k,line[i].r)-x;
R--;
update(L,R,line[i].d,,k-,);
area+=sum2[]*(line[i+].h-line[i].h);
}
printf("%.2lf\n", area);//用c++的输出流不对?用c语言的就A了 }
return ;
}
O - 覆盖的面积(线段树+扫描线)的更多相关文章
- hdu1255 覆盖的面积 线段树-扫描线
矩形面积并 线段树-扫描线裸题 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...
- HDU 1255 覆盖的面积 (线段树+扫描线+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...
- HDU 1255 覆盖的面积 线段树+扫描线
同 POJ1151 这次是两次 #include <iostream> #include <algorithm> #include <cstdio> #includ ...
- HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- H - 覆盖的面积(线段树-线段扫描 + 离散化(板题))
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1 ...
- hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...
- HDU 1255 覆盖的面积(线段树面积并)
描述 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正 ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- hdu3642 Get The Treasury 线段树--扫描线
Jack knows that there is a great underground treasury in a secret region. And he has a special devic ...
随机推荐
- Mybatis之配置文件
Mybatis_config.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE conf ...
- Adobe PhotoShop CS6中文破解版下载
在网上找了好多个PhotoShop破解版,但安装过程中都出现一些问题,用不了.现在找到一个比较小的PhotoShop CS6安装包,大小200M左右,下载解压,点击安装就可以使用了,安装过程十分简单. ...
- 洛谷 P1018乘积最大
题目描述 今年是国际数学联盟确定的“20002000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰9090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 ...
- maven解决大项目打包慢的问题
裁剪反应堆 -am, --also-make 同时构建所列模块的依赖模块.必须和-pl同时使用.如 mvn -pl test install -am ,将同时构建test的依赖模块. -amd, - ...
- Vmware 主机锁定模式
https://docs.vmware.com/cn/VMware-vSphere/6.5/com.vmware.vsphere.security.doc/GUID-88B24613-E8F9-40D ...
- C#——发送邮件
需要2个引用 using System.Net;using System.Net.Mail; using (MailMessage mailMessige=new MailMessage()) usi ...
- Linux(CENTOS7) RabbitMq安装
RabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
- SeetaFaceEngine系列1:Face Detection编译和使用
SeetaFace,根据GitHub上的介绍,就是一个开源的人脸检测.矫正和识别的开源库,是采用C++来编写的,并且是在CPU上执行的,没有用到GPU,但是可以用SSE或者OpenMP来加速.整个库分 ...
- OpenMP笔记(二)
原文:https://www.bearoom.xyz/2019/02/18/openmp2/ OpenMP是由三部分组成的:指令.库函数和环境变量. 一.指令 在C/C++中使用OpenMP需要用到的 ...
- php抓取网站图片源码
<?php /*完成网页内容捕获功能*/ function get_img_url($site_name){ $site_fd = fopen($site_name, "r&q ...