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 ...
随机推荐
- Windows Server 2012 配置远程桌面帐户允许多用户同时登录
网上找了很多关于设置远程桌面最大连接数的文章,大都是说先要到控制面板的管理工具中设置远程桌面会话主机等,大体和我之前的文章<设置WINDOWS SERVER 2008修改远程桌面连接数>里 ...
- linux简单安装方法
一.配置静态IP NAT:模式: 修改网卡eth0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 内容如下: DEVICE=eth0 HWADDR=:0C ...
- JavaScript中的闭包永远都存储在内存中,除非关闭浏览器
//閉包實現累加功能 function fn1() { var n = 1; add = function() { n += 1; } function fn2() { n += 1; console ...
- Java程序简介
---恢复内容开始--- java程序的基本构成: HelloDate.java package 语句 import 语句 类定义 -class 一个文件只能有一个public 类 (与文件同名) 类 ...
- C#学习笔记14——TRACE、DEBUG和TRACESOURCE的使用以及日志设计
Trace.Debug和TraceSource的使用以及日志设计 .NET Framework 命名空间 System.Diagnostics 包含用于跟踪执行流程的 Trace.Debug 和 ...
- Struts2内建拦截器
params拦截器 负责将请求参数设置为Action属性 staticParams拦截器 将配置文件中action元素的子元素param参数设置为Action属性 servletConfig拦截器 将 ...
- spring的一个小例子(二)--解析前面的小例子
接上篇:http://www.cnblogs.com/xuejupo/p/5236448.html 首先应该明白,一个web项目,web.xml是入口. 然后下面来分析上篇博客中出现的web.xml: ...
- 关于浏览器cookie的小知识
浏览器对于总的cookie数量是没有限制的,但是对于每个域名的cookie数量是有限制的. 一,不同的浏览器,对于一个域名的cookie数量限制上限是不同的: 1,IE6以下版本,最多20个.IE7以 ...
- Spring-boot在windows上安装CLI(Command Line Interface)的步骤!
首先去下载安装包,我这里整了一个zip包,一个tar包,下载地址:https://github.com/zhangyawei117/Spring-boot-CLI.git 下载完了之后,把zip包解压 ...
- squid 正向代理 简单配置
linux 正向同步 项目上web服务器不给访问外网,迁移服务器环境又太麻烦,决定给web服务器做正向代理,刚开始使用nginx,但是https代理一直不成功,后面大佬建议使用squid来达到相同目的 ...