题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265

题意:给你一张挖了洞的墙纸贴在墙上,问你总面积有多少。

挖了洞后其实就是多了几个矩形墙纸,一张墙纸挖了洞后可以分成4个小矩形至于怎么分看个人喜好,然后再求个矩形的面积并

要注意的是x1==x3||x2==x4||y1==y3||y2==y4时不用分矩形这是个小小的优化。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int M = 5e4 + 10;
struct ss {
int l , r , h , flag;
}s[M << 3];
struct TnT {
int l , r , len , add;
}T[M << 3];
bool cmp(ss a , ss b) {
return a.h < b.h;
}
void build(int l , int r , int p) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r , T[p].add = 0 , T[p].len = 0;
if(l == r)
return ;
build(l , mid , p << 1);
build(mid + 1 , r , (p << 1) | 1);
}
void pushup(int p) {
if(T[p].add) {
T[p].len = T[p].r - T[p].l + 1;
}
else if(T[p].l == T[p].r) {
T[p].len = 0;
}
else {
T[p].len = T[p << 1].len + T[(p << 1) | 1].len;
}
}
void updata(int l , int r , int p , int ad) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == l && T[p].r == r) {
T[p].add += ad;
pushup(p);
return ;
}
if(mid >= r) {
updata(l , r , p << 1 , ad);
}
else if(mid < l) {
updata(l , r , (p << 1) | 1 , ad);
}
else {
updata(l , mid , p << 1 , ad);
updata(mid + 1 , r , (p << 1) | 1 , ad);
}
pushup(p);
}
int main() {
int n;
while(scanf("%d" , &n) != EOF) {
if(n == 0)
break;
int gg = 0;
int x1 , x2 , x3 , x4 , y1 , y2 , y3 , y4;
int MAX = 0;
for(int i = 1 ; i <= n ; i++) {
scanf("%d%d%d%d%d%d%d%d" , &x1 , &y1 , &x2 , &y2 , &x3 , &y3 , &x4 , &y4);
x1++ , x2++ , x3++ , x4++ , y1++ , y2++ , y3++ , y4++;
MAX = max(max(max(x1 , x2) , max(x3 , x4)) , MAX);
if(x1 != x3) {
s[++gg].flag = -1;
s[gg].l = x1;
s[gg].r = x3;
s[gg].h = y4;
s[++gg].flag = 1;
s[gg].l = x1;
s[gg].r = x3;
s[gg].h = y3;
}
if(x2 != x4) {
s[++gg].flag = -1;
s[gg].l = x4;
s[gg].r = x2;
s[gg].h = y4;
s[++gg].flag = 1;
s[gg].l = x4;
s[gg].r = x2;
s[gg].h = y3;
}
if(y1 != y3) {
s[++gg].flag = -1;
s[gg].l = x1;
s[gg].r = x2;
s[gg].h = y3;
s[++gg].flag = 1;
s[gg].l = x1;
s[gg].r = x2;
s[gg].h = y1;
}
if(y2 != y4) {
s[++gg].flag = -1;
s[gg].l = x1;
s[gg].r = x2;
s[gg].h = y2;
s[++gg].flag = 1;
s[gg].l = x1;
s[gg].r = x2;
s[gg].h = y4;
}
}
sort(s + 1 , s + 1 + gg , cmp);
build(1 , MAX , 1);
int l , r;
l = s[1].l;
r = s[1].r - 1;
updata(l , r , 1 , s[1].flag);
long long area = 0;
for(int i = 2 ; i <= gg ; i++) {
area += (long long)T[1].len * (s[i].h - s[i - 1].h);
l = s[i].l;
r = s[i].r - 1;
updata(l , r , 1 , s[i].flag);
}
printf("%lld\n" , area);
}
return 0;
}

hdu 3265 Posters(线段树+扫描线+面积并)的更多相关文章

  1. HDU 3265 Posters (线段树+扫描线)(面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩 ...

  2. 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提

    给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...

  3. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  4. poj1511,线段树扫描线面积

    经典题,线段树扫描线其实类似区间更新,一般的做法是想象一根扫描线从上扫到下或者从左扫到右,本题的做法是从上扫到下 只要扫到了一根水平线,就将其更新到线段树对应区间中,区间和它的子区间是独立更新的 #i ...

  5. hdu 1542 Atlantis (线段树扫描线)

    大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...

  6. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

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

  7. HDU 1255 覆盖的面积 (线段树扫描线+面积交)

    自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了  题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...

  8. hdu 1542(线段树+扫描线 求矩形相交面积)

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

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 给你n个矩形,让你求出总的周长. 类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y ...

随机推荐

  1. 华为matebook14vm虚拟机错误

    1.创建时显示不支持64位虚拟机 测试环境: 华为matebook14 window10 专业工作站版  1903   问题描述: 创建虚拟机时显示:此主机不支持64位解决方案   问题参考: 参考1 ...

  2. Dubbo里面线程池的拒绝策略

    Dubbo里面线程池的拒绝策略 public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy { protecte ...

  3. Handler 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  4. Java爬虫框架 | 爬小说

    Jsoup,Java爬虫解决方案,中文文档:jsoup   不得不说Java的生态真的好,原来我以为爬虫是只能用Pyhton来写的,结果发现Java的爬虫框架不要太多……       一分钟你就可以写 ...

  5. 有关element 的一些问题(随时更新)

    <el-input></el-input> input  组件中官方自带的change时间是监听失去焦点之后的value变化,要想一只监听value的值变化的话需要使用  @i ...

  6. React的新特性 ---- Hooks ---- 的基本使用

    一.react-hooks概念 React中一切皆为组件,React中组件分为类组件和函数组件,在React中如果需要记录一个组件的状态的时候,那么这个组件必须是类组件.那么能否让函数组件拥有类组件的 ...

  7. Java学习|多线程学习笔记

    什么是线程?     可以理解为进程中独立运行的字任务.   使用多线程:     1.继承Thread类:从源码可以看到,Thread累实现了Runnable接口.         如果多次调用st ...

  8. (十七)c#Winform自定义控件-基类窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  9. 「雕爷学编程」Arduino动手做(15)——手指侦测心跳模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  10. [HEOI2013]SAO(树上dp,计数)

    [HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...