Description

Ted has a new house with a huge window. In this big summer, Ted decides to decorate the window with some posters to prevent the glare outside. All things that Ted can find are rectangle posters. 
However, Ted is such a picky guy that in every poster he finds something ugly. So before he pastes a poster on the window, he cuts a rectangular hole on that poster to remove the ugly part. Ted is also a careless guy so that some of the pasted posters may overlap when he pastes them on the window. 
Ted wants to know the total area of the window covered by posters. Now it is your job to figure it out. 
To make your job easier, we assume that the window is a rectangle located in a rectangular coordinate system. The window’s bottom-left corner is at position (0, 0) and top-right corner is at position (50000, 50000). The edges of the window, the edges of the posters and the edges of the holes on the posters are all parallel with the coordinate axes. 
 

Input

The input contains several test cases. For each test case, the first line contains a single integer N (0<N<=50000), representing the total number of posters. Each of the following N lines contains 8 integers x1, y1, x2, y2, x3, y3, x4, y4, showing details about one poster. (x1, y1) is the coordinates of the poster’s bottom-left corner, and (x2, y2) is the coordinates of the poster’s top-right corner. (x3, y3) is the coordinates of the hole’s bottom-left corner, while (x4, y4) is the coordinates of the hole’s top-right corner. It is guaranteed that 0<=xi, yi<=50000(i=1…4) and x1<=x3<x4<=x2, y1<=y3<y4<=y2. 
The input ends with a line of single zero. 
 

Output

For each test case, output a single line with the total area of window covered by posters.

题目大意:墙上有n张长方形的纸,每张纸都被挖掉了一个长方形(有可能贴着原长方形的边界),给这n个长方形的坐标及被挖掉的长方形的坐标,问这些纸一共覆盖了多少面积。

思路:把每个被挖掉一块的长方形分成4块或以下的真·长方形(怎么分随便你能AC就行),然后就是普通的扫描线+线段树的问题了。至于离散化,点数和数据范围一样大就省了。至于初始化线段树我想应该是不用的,如果代码是对的理论上来讲每做完一组数据,线段树都是空的才对。

代码(HDU 484MS/POJ 532MS):

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL; const int MAXN = ; struct Line {
int y, x_st, x_ed, flag;
Line() {}
Line(int y, int x_st, int x_ed, int flag):
y(y), x_st(x_st), x_ed(x_ed), flag(flag) {}
bool operator < (const Line &rhs) const {
return y > rhs.y;
}
}; Line a[MAXN * ];
int tree[MAXN * ], sum[MAXN * ];
LL ans; void update(int x, int l, int r, int tl, int tr, int t) {
int lc = x << , rc = lc ^ ;
if(tl <= l && r <= tr) {
tree[x] += t;
if(tree[x] > ) sum[x] = r - l;
else if(r - l == ) sum[x] = ;
else sum[x] = sum[lc] + sum[rc];
}
else {
int mid = (l + r) >> ;
if(tl < mid) update(lc, l, mid, tl, tr, t);
if(tr > mid) update(rc, mid, r, tl, tr, t);
if(tree[x] == ) sum[x] = sum[lc] + sum[rc];
else sum[x] = r - l;
}
} void solve(int n) {
sort(a, a + n);
ans = ;
for(int i = ; i < n; ++i) {
if(i > ) ans += (a[i - ].y - a[i].y) * LL(sum[]);
update(, , , a[i].x_st, a[i].x_ed, a[i].flag);
}
} int main() {
int n, x[], y[];
while(scanf("%d", &n) != EOF) {
if(n == ) break;
int cnt = ;
for(int i = ; i <= n; ++i) {
for(int j = ; j <= ; ++j) scanf("%d%d", &x[j], &y[j]);
if(x[] != x[]) {
a[cnt++] = Line(y[], x[], x[], );
a[cnt++] = Line(y[], x[], x[], -);
}
if(x[] != x[]) {
a[cnt++] = Line(y[], x[], x[], );
a[cnt++] = Line(y[], x[], x[], -);
}
if(y[] != y[]) {
a[cnt++] = Line(y[], x[], x[], );
a[cnt++] = Line(y[], x[], x[], -);
}
if(y[] != y[]) {
a[cnt++] = Line(y[], x[], x[], );
a[cnt++] = Line(y[], x[], x[], -);
}
}
solve(cnt);
cout<<ans<<endl;
}
}

HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)的更多相关文章

  1. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

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

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  3. POJ 1151 Atlantis (扫描线+线段树)

    题目链接:http://poj.org/problem?id=1151 题意是平面上给你n个矩形,让你求矩形的面积并. 首先学一下什么是扫描线:http://www.cnblogs.com/scau2 ...

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

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

  5. poj 1151 (未完成) 扫描线 线段树 离散化

    #include<iostream> #include<vector> #include<cmath> #include<algorithm> usin ...

  6. HDU 3260/POJ 3827 Facer is learning to swim(DP+搜索)(2009 Asia Ningbo Regional)

    Description Facer is addicted to a game called "Tidy is learning to swim". But he finds it ...

  7. HDU 3264/POJ 3831 Open-air shopping malls(计算几何+二分)(2009 Asia Ningbo Regional)

    Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...

  8. HDU 3262/POJ 3829 Seat taking up is tough(模拟+搜索)(2009 Asia Ningbo Regional)

    Description Students often have problems taking up seats. When two students want the same seat, a qu ...

  9. HDU 3268/POJ 3835 Columbus’s bargain(最短路径+暴力枚举)(2009 Asia Ningbo Regional)

    Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera ...

随机推荐

  1. Python 基础 变量和数据类型

    python 数据类型 一,整数,可以出来任意大小的整数. 如 1, 100, -8080,0 等等. 二,浮点数,浮点数也可以被成为小数. 三,字符串,字符串是以'' 或"". ...

  2. 通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学

    首发于:Aardio通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=429 ...

  3. Spring MVC体系

    框架搭建 web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...

  4. md5的理解

    md5之所以很难破解,是因为它是不可逆的(下面会解释),它是一种散列函数(哈希函数),并且是单向密码体制,即:从明文到密文的不可逆映射,只有加密过程没有解密过程. 为何说是不可逆映射呢?这是因为,md ...

  5. jQuery树形控件zTree使用小结

    作者:Fonour 字体:[增加 减小] 类型:转载 时间:2016-08-02我要评论 这篇文章主要为大家详细介绍了jQuery树形控件zTree使用方法,zTree树插件的基本使用方法,感兴趣的小 ...

  6. WSO2 API Manager中host Ip 不正确的问题解决方法

    问题: 根据官方的Quick start的教程,部署完AM后,添加的API的host Ip不正确,为localhost或者服务器上的其他虚拟ip. 安装版本:       WSO2AM 2.6.0 环 ...

  7. 关于ajax请求数据的方法

    $.ajax({  //课程详情信息    type:'get',     data: {'id':courseId},    dataType:'json',        beforeSend : ...

  8. hadoop生态搭建(3节点)-09.flume配置

    # http://archive.apache.org/dist/flume/1.8.0/# ===================================================== ...

  9. Vue.js的小例子--随便写的

    1.领导安排明天给同事们科普下vue 2.简单写了两个小例子 3.话不多说直接上代码 <!DOCTYPE html> <html> <head> <meta ...

  10. Python学习:10.Python装饰器讲解(一)

    情景介绍 一天,在你正在努力加班的时候,老板给交给你了一个任务,就是在这段代码里将所有函数开始输出一个‘hello’最后输出当前时间,再输出一个“end”,这段代码里包含了大量的函数,你会怎么做? d ...