题目链接

题意

给出n个矩形,求面积并。

思路

使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去。离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积。这里要注意线段树上结点维护的是线段的信息,而不是点的信息。

参考资料

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
#define lson l, m, rt<<1
#define rson m + 1, r, rt<<1|1
struct Node {
int st;
double l, r, id;
bool operator < (const Node &rhs) const {
return id < rhs.id;
}
} p[N];
double y[N], tree[N<<2];
int cnt[N<<2]; void PushUp(int l, int r, int rt) {
if(cnt[rt] > 0) tree[rt] = y[r+1] - y[l]; // r + 1是因为线段树上结点是线段,映射成点就要+1
else if(l == r) tree[rt] = 0; // 当这个线段没有cnt的时候就代表消失了
else tree[rt] = tree[rt<<1] + tree[rt<<1|1];
} void Update(int L, int R, int w, int l, int r, int rt) {
if(L <= l && r <= R) {
cnt[rt] += w;
PushUp(l, r, rt);
return ;
}
int m = (l + r) >> 1;
if(L <= m) Update(L, R, w, lson);
if(m < R) Update(L, R, w, rson);
PushUp(l, r, rt);
} int main() {
int cas = 1, n;
while(scanf("%d", &n), n) {
int cnt = 0, m = 0;
for(int i = 1; i <= n; i++) {
double x1, x2, y1, y2;
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
y[++cnt] = y1, y[++cnt] = y2;
p[++m] = (Node) { 1, y1, y2, x1 };
p[++m] = (Node) { -1, y1, y2, x2 };
}
sort(y + 1, y + 1 + cnt);
sort(p + 1, p + 1 + m);
cnt = unique(y + 1, y + 1 + cnt) - y - 1;
double ans = 0;
for(int i = 1; i <= m; i++) {
ans += tree[1] * (p[i].id - p[i-1].id);
int L = lower_bound(y + 1, y + 1 + cnt, p[i].l) - y;
int R = lower_bound(y + 1, y + 1 + cnt, p[i].r) - y - 1;
// R - 1是因为线段树上的结点是线段
Update(L, R, p[i].st, 1, cnt, 1);
printf("%d : %d - %d , %.2f\n", i, L, R, tree[1]);
}
printf("Test case #%d\n", cas++);
printf("Total explored area: %.2f\n\n", ans);
}
return 0;
}

HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***的更多相关文章

  1. HDU - 1542 Atlantis(线段树求面积并)

    https://cn.vjudge.net/problem/HDU-1542 题意 求矩形的面积并 分析 点为浮点数,需要离散化处理. 给定一个矩形的左下角坐标和右上角坐标分别为:(x1,y1).(x ...

  2. HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)

    传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...

  3. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. poj 1151 Atlantis (离散化 + 扫描线 + 线段树 矩形面积并)

    题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 映射到y轴,并且记录下每个的y坐标,并对y坐标进行离散. 然后按照x从左向右扫描. #include <io ...

  5. hdu1542(线段树——矩形面积并)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 分析:离散化+扫描线+线段树 #pragma comment(linker,"/STA ...

  6. POJ 1542 Atlantis(线段树 面积 并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 参考网址:http://blog.csdn.net/sunmenggmail/article/d ...

  7. POJ 1151 HDU 1542 Atlantis(扫描线)

    题目大意就是:去一个地方探险,然后给你一些地图描写叙述这个地方,每一个描写叙述是一个矩形的右下角和左上角.地图有些地方是重叠的.所以让你求出被描写叙述的地方的总面积. 扫描线的第一道题,想了又想,啸爷 ...

  8. poj1151 Atlantis——扫描线+线段树

    题目:http://poj.org/problem?id=1151 经典的扫描线问题: 可以用线段树的每个点代表横向被矩形上下边分割开的每一格,这样将一个矩形的出现或消失化为线段树上的单点修改: 每个 ...

  9. HDU 1828:Picture(扫描线+线段树 矩形周长并)

    题目链接 题意 给出n个矩形,求周长并. 思路 学了区间并,比较容易想到周长并. 我是对x方向和y方向分别做两次扫描线.应该记录一个pre变量,记录上一次扫描的时候的长度,对于每次遇到扫描线统计答案的 ...

随机推荐

  1. 2015微软创新杯Imaginecup正在进行参赛(报名截止日期2014年12月31日本23:59)

    CSDN高校俱乐部与微软官方合作,2015微软创新杯大赛中国区官网落户CSDN高校俱乐部:http://student.csdn.net/mcs/imaginecup2015 在微软官方设置创新杯中国 ...

  2. Emgu-WPF学习使用-中值模糊

    原文:Emgu-WPF学习使用-中值模糊 实现效果: 实现途径: 前提:Image File-> System.Drawing.Bitmap->Image<Bgr, byte> ...

  3. mysql主从配置及其读写分离

    mysql主从配置意思就是一个主mysql服务器,一个从mysql服务器,一共要用到两台服务器.主服务器新增一个账号专门让从服务器来访问同步工作,主从配置完成后,主服务器主要就是新增和update操作 ...

  4. 图像滤镜艺术---Photoshop实现Instagram Amaro滤镜特效

    原文:图像滤镜艺术---Photoshop实现Instagram Amaro滤镜特效 本文是我收集的一些使用Photoshop来实现Instagram滤镜的一些内容,在这里跟大家分享一下,这些效果是完 ...

  5. qt mingw64版本编译报错:incorrect register `%rax' used with `l' suffix(movl要改成mov)

    环境:WIN10 编译器:mingw64的g++.exe 我的目的是把程序编译成64bit版本的,所以一开始遇到该错误是丈二和尚摸不着头脑,google了一圈也没找到准确的答案.后来从某些回答中大概发 ...

  6. System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

    今天在写导入Excel表格的代码,运行时却报异常,异常信息: System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0 ...

  7. 微信小程序把玩(十六)form组件

    原文:微信小程序把玩(十六)form组件 form表单组件 是提交form内的所有选中属性的值,注意每个form表单内的组件都必须有name属性指定否则提交不上去,button中的type两个subm ...

  8. 关于SetLocaleInfo()

    原文:关于SetLocaleInfo() 此函数用于设置系统的一些本地信息, 非常有用. 比如日期格式为'yyyy/mm/dd'时, 稍微不注意,有些程序语句会报错. 以下资料网络收集: 1. Set ...

  9. ORA-23421: job number 225 is not a job in the job queue

    在对数据库进行异机恢复之后,为了防止上面作业自动执行,扰乱正常业务系统,需要将测试库上的作业和db_link进行删除:但是使用sys用户连接进去,删除的时候报如下错误SQL> exec DBMS ...

  10. Android卡片设置透明度失效问题

    最近在做蓝牙电话项目,需要支持双路通话,涉及到通话卡片透明度调节,当正在通话中,有新的来电时,原来的通话卡片需要做成30%的透明度,本来很简单的一个小改进,但通过 setAlpha()接口总是失效!  ...