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 ...
随机推荐
- java 对象流
TV.java import java.io.*; public class TV implements Serializable{ String name; int price; public vo ...
- cocos2d-x 3.3 显示中文
Resources文件夹下的strings.xml: <dict> <key>targetScore</key> <string>目标分数</st ...
- 转:使用WebDriver过程中遇到的那些问题
在做web项目的自动化端到端测试时主要使用的是Selenium WebDriver来驱动浏览器.Selenium WebDriver的优点是支持的语言多,支持的浏览器多.主流的浏览器Chrome.Fi ...
- Codeforces Round #366 (Div. 2) C. Thor (模拟)
C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- [jQueryUI] – Chosen:select下拉选择框美化插件及问题
Chosen 是一个支持jquery的select下拉框美化插件,它能让丑陋的.很长的select选择框变的更好看.更方便.不仅如此,它更扩展了select,增加了自动筛选的功能.它可对列表进行分组, ...
- JavaScript中call,apply,bind方法的总结
原文链接:http://www.cnblogs.com/pssp/p/5215621.html why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之 ...
- 读写锁的实现原理(pthread_rwlock_t)
引言 不同的锁之间的语义是不一样的,没有一劳永逸的锁,只有更适合的锁. 如果是同一进程里的不同线程共享读写锁,那么读写锁变量的维护是在进程内部即可.如果是不同进程共享读写锁,那么读写锁变量的维护是在共 ...
- PAT1010
Given a pair of positive integers, for example, 6 and 110, 给出一对正整数,例如6和110 can this equation 6 = 110 ...
- 转 使用 HttpClient 4 进行文件上传
http://www.tuicool.com/articles/Y7reYb 1. 概述 本教程我们将描述如何使用 HttpClient 4进行一次多文件上传操作 . 我们将使用 http://ec ...
- FMDB增删查改
创建,插入,更新和删除:使用executeUpdate方法,而查询则用executeQuery 1.实例化FMDatabase //paths: ios下Document路径,Document为ios ...