题目链接:http://poj.org/problem?id=1151

题目:

题意:求所有矩形的面积,重合部分只算一次。

思路:扫描线入门题,推荐几篇学扫描线的博客:

1.http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html

2.https://blog.csdn.net/qq_38786088/article/details/78633478

3.https://blog.csdn.net/lwt36/article/details/48908031(强烈推荐!)

代码实现如下:

 #include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef unsigned long long ull; #define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f; inline int read() {//读入挂
int ret = , c, f = ;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * + c - '';
if(f < ) ret = -ret;
return ret;
} int n, t;
double x1, y_1, x2, y_2;
double y[]; struct Line {
double y1, y2, x;
int flag;
bool operator < (const Line& a) const {
return x < a.x;
}
}line[]; struct node {
int l, r, cover;
double lf, rf, len;
}segtree[maxn*]; void push_up(int i) {
if(segtree[i].cover > ) {
segtree[i].len = segtree[i].rf - segtree[i].lf;
} else if(segtree[i].l + == segtree[i].r) {
segtree[i].len = ;
} else {
segtree[i].len = segtree[i*].len + segtree[i*+].len;
}
} void build(int i, int l, int r) {
segtree[i].l = l, segtree[i].r = r;
segtree[i].lf = y[l], segtree[i].rf = y[r];
segtree[i].cover = segtree[i].len = ;
if(l + == r) return;
int mid = (l + r) >> ;
build(i * , l, mid);
build(i * + , mid, r);
} void update(int i, double l, double r, int flag) {
if(segtree[i].lf == l && segtree[i].rf == r) {
segtree[i].cover += flag;
push_up(i);
return;
}
if(l >= segtree[i * + ].lf) {
update(i * + , l, r, flag);
} else if(r <= segtree[i * ].rf) {
update(i * , l, r, flag);
} else {
update(i * , l, segtree[i*].rf, flag);
update(i * + , segtree[i*+].lf, r, flag);
}
push_up(i);
} int main() {
//FIN;
int icase = ;
while(~scanf("%d", &n) && n) {
t = ;
printf("Test case #%d\n", ++icase);
for(int i = ; i <= n; i++,t++) {
scanf("%lf%lf%lf%lf", &x1, &y_1, &x2, &y_2);
line[t].x = x1;
line[t].y1 = y_1;
line[t].y2 = y_2;
line[t].flag = ;
y[t] = y_1;
line[++t].x = x2;
line[t].y1 = y_1;
line[t].y2 = y_2;
line[t].flag = -;
y[t] = y_2;
}
sort(line + , line + t);
sort(y + , y + t);
build(, , t - );
double ans = ;
update(, line[].y1, line[].y2, line[].flag);
for(int i = ; i < t; i++) {
ans += segtree[].len * (line[i].x - line[i-].x);
update(, line[i].y1, line[i].y2, line[i].flag);
}
printf("Total explored area: %.2f\n\n", ans);
}
return ;
}

Atlantis(POJ1151+线段树+扫描线)的更多相关文章

  1. Atlantis poj1151 线段树扫描线

    Atlantis poj1151 线段树扫描线 题意 题目给了n个矩形,每个矩形给了左下角和右上角的坐标,矩形可能会重叠,求的是矩形最后的面积. 题解思路 这个是我线段树扫描线的第一题,听了学长的讲解 ...

  2. hdu1542 Atlantis (线段树+扫描线+离散化)

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

  3. POJ1151+线段树+扫描线

    /* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  4. poj1151 Atlantis (线段树+扫描线+离散化)

    有点难,扫描线易懂,离散化然后线段树处理有点不太好理解. 因为这里是一个区间,所有在线段树中更新时,必须是一个长度大于1的区间才是有效的,比如[l,l]这是一根线段,而不是区间了. AC代码 #inc ...

  5. P - Atlantis (线段树+扫描线)

      There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Som ...

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

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

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

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

  8. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

  9. 【POJ1151】Atlantis(线段树,扫描线)

    [POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...

随机推荐

  1. iOS- 利用UIImageView自己整了个不会说话的汤姆猫

    1.实现思路 先说说我实现它的主要思路,很简单,主要利用UIImageView连续动画播放,和按钮的点击事件,就可以完成了这么一个简单的不会说话的汤姆猫. 2.实现细节 2.1.加载本地字典里保存的本 ...

  2. .net Mvc4 View—布局页与分部页

    ▲      一.Layout属性     1.1.@RenderPage():渲染制定的页面到占位符.     注意:@RenderPage()可以使用多次,这点与@RenderBody()不同   ...

  3. 3ds Max学习日记(七)

      第7章讲的是多边形建模,实例略多,有十六个,再加上周日的怠惰感,只做了几个实例. 附上今日的劳动成果:   布料(创建一个平面,转换为可编辑多边形,然后调整顶点,连接一些边,添加网格平滑,转换为可 ...

  4. java出现以下警告:WARN No appenders;WARN Please initialize the log4j的处理方法

    编译java或引用别的代码时出现以下警告: log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKee ...

  5. 《Effective C#》快速笔记(五)- - C# 中的动态编程

    静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静态类型的语言,不过它加入了动态类型的语言特性,可以更高效地解决问题. 一. ...

  6. dev_queue_xmit 发生了什么?skb还会在哪里缓存

    见 codebox/net/qdisk/xmit.log中保存了一份记录 调用关系 sch_direct_xmit --> dev_hard_start_xmit --> xmit_one ...

  7. ssm框架pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  8. Android ListView各种效果实现总结,持续更新...

    一.ListView圆角:重写ListView的onInterceptTouchEvent方法,通过pointToPosition(x,y)方法判断当前点击位置所对应的项,有三种情况:分别是第一项.最 ...

  9. 【BZOJ5301】【CQOI2018】异或序列(莫队)

    [BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...

  10. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...