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 ...
随机推荐
- MOCTF-Crypt-writeup
MOctf Crypt Writeup记录 都不难,就随便记录记录下. MOCTF平台地址:http://www.moctf.com 0x01 数据库密码 hint:20岁的小刚,自幼热爱信息安全,一 ...
- codeforces 576 div2 A-D题解
A题 Description 题目链接: https://codeforces.com/contest/1199/problem/A 题意: 给定长度为n(1≤n≤100000)的一个序列a,以及两个 ...
- ImageView 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- Spark 系列(七)—— 基于 ZooKeeper 搭建 Spark 高可用集群
一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...
- cogs 1254. 最难的任务 Dijkstra + 重边处理
1254. 最难的任务 ★ 输入文件:hardest.in 输出文件:hardest.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 这个真的很难.算出 123 ...
- spring-boot 示例大全
spring-boot-demo Spring Boot 学习示例,将持续更新... 本项目基于spring boot 最新版本(2.1.7)实现 什么是spring-boot Spring Boot ...
- 基于Starling的mask实现
作为一个从c++转过来的程序员,flash原生的自定义mask实在是太好用,能方便实现各种效果,比如新手引导的高亮.viewport效果等.可惜starling的显示对象并不支持mask特性,查阅go ...
- Redis——发布和订阅
发布与订阅(又称pub/sub),订阅者(listener)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息(binary string message).每 ...
- Xlistview_聚合菜谱大全数据
public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...
- Java开发包Jedis
Jedis: http://www.oschina.net/p/jedis (Redis的官方首选Java开发包) <!--Redis --> <dependency> < ...