hdu 3265 Posters(线段树+扫描线+面积并)
题目链接: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(线段树+扫描线+面积并)的更多相关文章
- HDU 3265 Posters (线段树+扫描线)(面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩 ...
- 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- poj1511,线段树扫描线面积
经典题,线段树扫描线其实类似区间更新,一般的做法是想象一根扫描线从上扫到下或者从左扫到右,本题的做法是从上扫到下 只要扫到了一根水平线,就将其更新到线段树对应区间中,区间和它的子区间是独立更新的 #i ...
- hdu 1542 Atlantis (线段树扫描线)
大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...
- HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1255 覆盖的面积 (线段树扫描线+面积交)
自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了 题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...
- hdu 1542(线段树+扫描线 求矩形相交面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU 1828 Picture (线段树+扫描线)(周长并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 给你n个矩形,让你求出总的周长. 类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y ...
随机推荐
- logging模块 旗舰版
函数式简单配置 import logging logging.debug('debug message') logging.info('info message') logging.warning(' ...
- 补充Java面试记录
补充Java面试记录 背景:这两天面试遇到的部分问题都分散在了前面两篇文摘中,这里再做一些其他的记录,以备不时之需! 一.谈谈你对SpringBoot的理解? SpringBoot简介:SpringB ...
- ZK安装、ZK配置、ZK集群部署
今天心血来潮,想搞一下zookeeper集群.具体步骤记录下吧~嘻嘻
- oracle的JDBC连接
package com.xian.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...
- 为什么你要用 Spring?
前言 现在Spring几乎成为了Java在企业级复杂应用开发的代名词,得益于Spring简单的设计哲学和其完善的生态圈,确实为廉颇老矣,尚能饭否的 Java 带来了“春天”,有很多同学刚接触Jav ...
- restapi(3)- MongoDBEngine : MongoDB Scala编程工具库
最近刚好有同事在学习MongoDB,我们讨论过MongoDB应该置于服务器端然后通过web-service为客户端提供数据的上传下载服务.我们可以用上节讨论的respapi框架来实现针对MongoDB ...
- JAVA基础——Switch条件语句
JAVA基础——switch 条件语句 switch语句结构: switch(表达式){ case值1: 语句体1: break: case值2: 语句体2: break: case值3: 语句体3: ...
- selenium操作cookies实现免密登录,自动发微博
一直想用selenium实现个小功能,比如发微博之类的,但是有的网站在登录会有验证码,没想到太好的方法解决,于是想到利用cookies来登录网站 第一步:获取一个可用的cookies,获取的cooki ...
- hdu1241 油田计数
具体思路:求联通块,在"@“的周围进行dfs,使用8个方向向量来代表搜索的方向 贴一下我的主要代码段: int dir[8][2]={{1,1},{-1,-1},{1,-1},{-1,1}, ...
- Visual Studio 中两个窗体(WinForm)之间相互传值的方法
编写WinowsForm应用程序时,实现两个窗体之间相互传递值的方法其实很简单.以下用一个例子说明:在名为FormMain主窗体运行过程中利用名为FormInfo窗体,获取用户输入信息,并将这些信息返 ...