博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1255——覆盖的面积(线段树+离散+扫描线)
阅读量:4363 次
发布时间:2019-06-07

本文共 2556 字,大约阅读时间需要 8 分钟。

给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.

Input

输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000.

注意:本题的输入数据较多,推荐使用scanf读入数据.

Output

对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.

Sample Input

251 1 4 21 3 3 72 1.5 5 4.53.5 1.25 7.5 46 3 10 730 0 1 11 0 2 12 0 3 1

Sample Output

7.630.00

题解:

与这一题类似,建议先搞懂这一题:

如果搞懂了上面那道题,这道题就很简单了,基本一模一样,只需要把条件

if(Tree[temp].cnt)改成if(Tree[temp].cnt>1)就行了。

代码:

#include 
using namespace std;const int MAXN = 2005;struct Node{ double l,r,h; int flag; Node(){} Node(double a,double b,double c,int d): l(a),r(b),h(c),flag(d){} bool operator < (const struct Node &b)const{ return h < b.h; }}node[MAXN];struct D{ double value; int cnt; bool lazy;}Tree[MAXN*4];double X[MAXN];int Bin(double key , int Num){ int l = 1,r = Num,mid; while(l<=r){ mid = l + (r-l)/2; if(X[mid] == key)return mid; else if(X[mid] > key)r = mid-1; else if(X[mid] < key)l = mid+1; } return -1;}void Build(int temp , int left , int right){ Tree[temp].cnt = 0; Tree[temp].value = 0.0; Tree[temp].lazy = false; if(left == right)return; int mid = left + (right-left)/2; Build(temp<<1,left,mid); Build(temp<<1|1,mid+1,right);}void PushDown(int temp , int left , int right){ if(Tree[temp].lazy){ Tree[temp<<1].cnt = Tree[temp<<1|1].cnt = Tree[temp].cnt; Tree[temp<<1].lazy = Tree[temp<<1|1].lazy = true; int mid = left + (right-left)/2; if(Tree[temp].cnt>1){ Tree[temp<<1].value = X[mid+1]-X[left]; Tree[temp<<1|1].value = X[right+1]-X[mid+1]; } else Tree[temp<<1].value = Tree[temp<<1|1].value = 0; Tree[temp].lazy = false; }}void Up(int temp){ if(Tree[temp<<1].cnt==-1 || Tree[temp<<1|1].cnt==-1 || Tree[temp<<1].cnt!=Tree[temp<<1|1].cnt)Tree[temp].cnt = -1; else Tree[temp].cnt = Tree[temp<<1].cnt; Tree[temp].value = Tree[temp<<1].value + Tree[temp<<1|1].value;}void Updata(int temp , int left , int right , int ql , int qr ,int flag){ if(ql>right || qr
=right){ if(Tree[temp].cnt != -1){ Tree[temp].cnt += flag; Tree[temp].lazy = true; if(Tree[temp].cnt>1)Tree[temp].value = X[right+1]-X[left]; else Tree[temp].value = 0; return ; } } PushDown(temp,left,right); int mid = left + (right-left)/2; if(ql<=mid)Updata(temp<<1,left,mid,ql,qr,flag); if(qr>mid)Updata(temp<<1|1,mid+1,right,ql,qr,flag); Up(temp);}int main(){ int N,T; scanf("%d",&T); double x1,x2,y1,y2; double ans; while(T--){ scanf("%d",&N); ans = 0.0;//最终面积 int n = 0,m = 0; for(int _=0 ; _

转载于:https://www.cnblogs.com/vocaloid01/p/9514101.html

你可能感兴趣的文章
Xpath在选择器中正确,在代码中返回的是空列表问题
查看>>
leecode第一百九十八题(打家劫舍)
查看>>
【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
查看>>
07-3. 数素数 (20)
查看>>
写一个欢迎页node统计接口Py脚本(邮件,附件)-py
查看>>
计算两个日期之间的天数
查看>>
Android关于buildToolVersion与CompileSdkVersion的区别
查看>>
袋鼠云日志,日志分析没那么容易
查看>>
缓存穿透 缓存雪崩 缓存并发
查看>>
了解你的Linux系统:必须掌握的20个命令
查看>>
js setInterval 启用&停止
查看>>
knockoutJS学习笔记04:监控属性
查看>>
Linux下启动/关闭Oracle
查看>>
session和cookie的区别
查看>>
alert弹出窗口,点击确认后关闭页面
查看>>
oracle问题之数据库恢复(三)
查看>>
单点登陆(SSO)
查看>>
HR,也确实“尽职尽责”
查看>>
MaxComputer 使用客户端配置
查看>>
20190823 顺其自然
查看>>