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 ...
随机推荐
- CentOS下Samba服务器的配置
主要用途: 在两台计算机间共享文件.打印机 安装: yum install samba 启动服务: /etc/rc.d/init.d/smb start 添加用户 (必须是系统中真实存在的用户) s ...
- Gym 100518E Embedding Caterpillars
构造+DFS 很容易的可以构造两个,最后一个不会构造的话 DFS一下就可以了 #include<iostream> #include<string> #include< ...
- vbs 解析html文档的方法
vbs 解析html文档的方法(htmlfile) 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2014-06-18我要评论 关于VBS采集,网上流行比较多的方法都是正则,其实 h ...
- 英文SEO外部链接资源收集之常用的footprints
inurl:/privacy-policy "Using Article Directory plugin"inurl:/terms "Using Article D ...
- cordova 启动界面config.xml配置
<preference name="SplashScreen" value="screen"/> <preference name=" ...
- ab测试 uwsgi遇到的问题
1 请求并发数目较大时,接收到的数目小于发送的数目 1.1 描述:uwsgi正常返回302跳转 ab -n 5000 -c 250 -g test.log "192.168.50.20:90 ...
- zabbix agent自动安装脚本
#!/bin/bash #desc: used for autoinstall zabbix client #说明:本脚本旨在批量安装zabbix_agent,在一个服务器上放好软件和配置文件,执行本 ...
- io scheduler
http://doctorlzr1988.blog.163.com/blog/static/50456520201051905236683/
- activity管理类 appManager
程序启动第一个界面类: net.oschina.app.AppStart功能描述:一张图片代码细节描述:一个透明度的动画效果,效果动画完成后自动启动新的Activity(Main) 基本BaseAct ...
- copy_part_stat.sql
spool 04_copy_part_stat.log conn / as sysdba execute sys.dbms_stats.export_schema_stats(ownname=> ...