poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)
Description
Write a program to calculate the perimeter. An example with 7 rectangles is shown in Figure 1.
The corresponding boundary is the whole set of line segments drawn in Figure 2.
The vertices of all rectangles have integer coordinates.
Input
0 <= number of rectangles < 5000
All coordinates are in the range [-10000,10000] and any existing rectangle has a positive area.
Output
Sample Input
7
-15 0 5 10
-5 8 20 25
15 -4 24 14
0 -6 16 4
2 15 10 22
30 10 36 20
34 0 40 16
Sample Output
228
Source
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=;
struct Line{
int x,y1,y2;
int flag;
bool operator<(const Line s)
{
if(x==s.x) return flag>s.flag;
return x<s.x;
}
}line[N*]; struct Tree
{
int l,r;
bool lf,rf; ///左右边界点是否被覆盖;
int cover_len;
int cover_num;
int num; ///矩形数目;
}tr[N*]; vector<int>v; void build(int l,int r,int i)
{
tr[i].l=l; tr[i].r=r;
tr[i].cover_len=;
tr[i].cover_num=;
tr[i].num=;
tr[i].lf=tr[i].rf=false;
if(l+==r) return ;
int mid=(l+r)>>;
build(l,mid,i<<);
build(mid,r,i<<|);
}
void process(int i)
{
if(tr[i].cover_num>)
{
tr[i].cover_len=v[tr[i].r]-v[tr[i].l];
tr[i].lf=tr[i].rf=true;
tr[i].num=;
return ;
}
if(tr[i].l+==tr[i].r)
{
tr[i].cover_len=;
tr[i].num=;
tr[i].lf=tr[i].rf=false;
return ;
}
int ls=(i<<);
int rs=(i<<|);
tr[i].cover_len=tr[ls].cover_len+tr[rs].cover_len;
tr[i].num=tr[ls].num + tr[rs].num - (tr[ls].rf & tr[rs].lf);
tr[i].lf=tr[ls].lf; tr[i].rf=tr[rs].rf;
}
void update(int i,Line t)
{
if(t.y1<=v[tr[i].l] && v[tr[i].r]<=t.y2)
{
tr[i].cover_num+=t.flag;
process(i);
return ;
}
int mid=(tr[i].l+tr[i].r)>>;
if(t.y1<v[mid]) update(i<<,t);
if(t.y2>v[mid]) update(i<<|,t);
process(i);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
v.clear();
for(int i=;i<n;i++)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
line[i*].x=x1; line[i*].y1=y1; line[i*].y2=y2; line[i*].flag=;
line[i*+].x=x2; line[i*+].y1=y1; line[i*+].y2=y2; line[i*+].flag=-;
v.push_back(y1);
v.push_back(y2);
}
sort(line,line+*n);
sort(v.begin(),v.end());
int num=unique(v.begin(),v.end())-v.begin(); build(,num-,);
int ans=,len=;
for(int i=;i<*n;i++)
{
if(i>) ans+=tr[].num**(line[i].x-line[i-].x);
update(,line[i]);
ans+=abs(tr[].cover_len-len);
len=tr[].cover_len;
}
printf("%d\n",ans);
}
return ;
}
poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)的更多相关文章
- poj 1177 Picture (线段树 扫描线 离散化 矩形周长并)
题目链接 题意:给出n个矩形,每个矩形给左下 和 右上的坐标,求围成的周长的长度. 分析: 首先感谢大神的博客,最近做题经常看大神的博客:http://www.cnblogs.com/kuangbin ...
- POJ 1177 Picture(线段树 扫描线 离散化 求矩形并面积)
题目原网址:http://poj.org/problem?id=1177 题目中文翻译: 解题思路: 总体思路: 1.沿X轴离散化建树 2.按Y值从小到大排序平行与X轴的边,然后顺序处理 如果遇到矩形 ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...
- UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
E - 秋实大哥与家 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...
随机推荐
- #2019-2020-4 《Java 程序设计》第八周总结
2019-2020-4 <Java 程序设计>第八周知识总结 第15章:泛型与集合框架 一.泛型 1.泛型(Generics)是可以建立具有类型安全的集合框架,如链表.散列映射等数据结构: ...
- C语言内存四区的学习总结(一)---- 静态区
最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...
- Maven之pom.xml配置文件详解
此文非原创,摘自:https://www.baidu.com/link?url=GlGgW21nijIiULDZj0RfPH8ofqGMqEnAzXiym7O3hfrZM5nFH2enukemBNTX ...
- abaqus的umat在vs中debug调试
配置参考:https://www.jishulink.com/content/post/333909 常见错误:http://blog.sina.com.cn/s/blog_6116bc050100e ...
- <c:forEach>循环列表,获取勾选的checkbox中某个<td>的值
<table> <!--列表表头 开始 --> <tr> <th><input type="checkbox" name=&q ...
- python_flask 基础巩固 (URL_FOR 详解)
URL_FOR 详解 url_for 通过 视图函数能够返回对应的url,url_for 有两个参数,endpoint(视图 函数)和关键字参数 url_for('my_list',page=2),多 ...
- C#中数组、ArrayList和List三者的区别 转
在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...
- hdu 1086 You can Solve a Geometry Problem too [线段相交]
题目:给出一些线段,判断有几个交点. 问题:如何判断两条线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若 ...
- Shader_ShaderForge_NGUI_流光&波纹&消融
Shader篇 总结:总算解决了NGUI中Shader不能实时更改的问题,原来NGUI中的Texture组件提供了OnRender代码示例如下 /*************************** ...
- IntelliJ IDEA小问题通过操作软件解决
Diamond types are not supported at this language level http://blog.csdn.net/qq_34884729/article/deta ...