HDU 1255 覆盖的面积 ——(线段树+扫描线)
又做了一题扫描线以后对节点的覆盖标记理解的更加深刻了。
代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define t_mid (l+r>>1)
#define ls (o<<1)
#define rs (o<<1|1)
#define lson ls,l,t_mid
#define rson rs,t_mid+1,r
using namespace std;
const int N = + ;
const int MAX = N * ;
const double eps = 1e-; struct seg
{
double x1,x2,y;
int d;
bool operator < (const seg & temp) const
{
return std::fabs(y-temp.y) <= eps ? d > temp.d : y < temp.y;
}
}g[N<<];
int n,tot,ptot;
int lazy[MAX<<];
double pos[MAX],c[MAX<<],cc[MAX<<];
void add(double x1,double x2,double y,int d)
{
tot++;
g[tot] = {x1,x2,y,d};
}
void read()
{
tot = ptot = ;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
add(x1,x2,y1,);
add(x1,x2,y2,-);
pos[++ptot] = x1;
pos[++ptot] = x2;
}
sort(g+,g++tot);
sort(pos+,pos++ptot);
int m = ;
for(int i=;i<=ptot;i++)
{
if(std::fabs(pos[i]-pos[i-]) > eps)
{
pos[++m] = pos[i];
}
}
ptot = m;
} int Find(double x)
{
int L = , R = ptot;
while(L <= R)
{
int mid = L + R >> ;
if(std::fabs(pos[mid]-x) <= eps) return mid;
else if(pos[mid] < x) L = mid + ;
else R = mid - ;
}
return -;
} void pushup(int o,int l,int r)
{
if(lazy[o] > ) c[o] = pos[r] - pos[l-];
else if(l == r) c[o] = ;
else c[o] = c[ls] + c[rs];
/*************************/
if(lazy[o] >= ) cc[o] = pos[r] - pos[l-];
else if(l == r) cc[o] = ;
else if(lazy[o] == ) cc[o] = c[ls] + c[rs];
else cc[o] = cc[ls] + cc[rs];
} void update(int o,int l,int r,int ql,int qr,int f)
{
if(ql == l && qr == r)
{
lazy[o] += f;
pushup(o,l,r);
return ;
}
if(qr <= t_mid) update(lson,ql,qr,f);
else if(ql > t_mid) update(rson,ql,qr,f);
else
{
update(lson,ql,t_mid,f);
update(rson,t_mid+,qr,f);
}
pushup(o,l,r);
} void solve()
{
memset(lazy,,sizeof(lazy));
memset(c,,sizeof(c));
memset(cc,,sizeof(cc));
double ans = ;
for(int i=;i<=tot;)
{
int j = i;
while(j <= tot && std::fabs(g[i].y-g[j].y) <= eps)
{
int L = Find(g[j].x1);
int R = Find(g[j].x2);
/*
下面的L要加1是因为两个点重合但是其实线段是不重合的,
所以线段树内不能让他们管辖同一块地方
而pushup里面再L减1是因为,计算两点之间的距离要用原来的点算
*/
update(,,MAX,L+, R, g[j].d);
j++;
}
if(j <= tot) ans += 1.0*(g[j].y-g[i].y) * cc[];
i = j;
}
printf("%.2f\n",ans);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
read();
solve();
}
return ;
}
HDU 1255 覆盖的面积 ——(线段树+扫描线)的更多相关文章
- HDU 1255 覆盖的面积 (线段树+扫描线+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...
- HDU 1255 覆盖的面积 线段树+扫描线
同 POJ1151 这次是两次 #include <iostream> #include <algorithm> #include <cstdio> #includ ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- HDU 1255 覆盖的面积(线段树面积并)
描述 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正 ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- hdu1255 覆盖的面积 线段树-扫描线
矩形面积并 线段树-扫描线裸题 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
了校赛,还有什么途径可以申请加入ACM校队? 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
随机推荐
- HDU 5323 DFS
DFS Time Limit : 5000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissio ...
- java 方法的重载的语法规则
class People { float hello(int a,int b) { return a+b; } float hello(long a,int b) { return a-b; } do ...
- eclipse没有(添加)"Dynamic Web Project"选项的方法【转载】
第一种方法: 你安装的是专门开发java项目的,而Dynamic Web Project 属于J2EE技术,所以你要专门下载一个集成了J2EE插件的Eclipse,(eclipse-jee-heli ...
- POJ 1365 Prime Land(整数拆分)
题意:感觉题意不太好懂,题目并不难,就是给一些p和e,p是素数,e是指数,然后把这个数求出来,设为x,然后让我们逆过程输出x-1的素数拆分形式,形式与输入保持一致. 思路:素数打表以后正常拆分即可. ...
- hdu - 2586 How far away ?(最短路共同祖先问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 最近公共祖先问题~~LAC离散算法 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起 ...
- IDL 实现PCA算法
在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种分析.简化数据集的技术.主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特 ...
- AndroidGradle --多渠道打包配置(转发)
需求 国内Android app发布一般会有多个渠道,为了跟踪发展情况,通常会为每一个渠道定制一个特别的apk. 一般友盟之类第三方统计的渠道ID定义如下,以wandoujia为例 <meta- ...
- robot_framewok自动化测试
robot_framewok自动化测试 http://wenku.baidu.com/view/691abcaa4b73f242336c5fec.html 接口自动化测试框架设计 http://wen ...
- ural1542 Autocompletion
Autocompletion Time limit: 2.0 secondMemory limit: 64 MB The Japanese are infinitely in love with ma ...
- Recover Polygon (easy)
Recover Polygon (easy) The zombies are gathering in their secret lair! Heidi will strike hard to des ...