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 ...
随机推荐
- java学习(一)
目录 java简介 java基础 基本语法 java标识符 java变量 变量类型 变量声明 java常量 Java 基本数据类型 内置数据类型 引用数据类型 Java类型转换 java注释 操作符 ...
- java之路 把1到100之间的数的偶数相加
/** *把1到100之间的数的偶数相加 */ class Demo{ public static void main(String[] args){ int i =1; int sum = 0; d ...
- js url参数解析获取
function get_url_parm_list(str){ var params=str.substr(str.indexOf('?')+1); var param_list=[]; while ...
- Python 知识小tips
python进制转换函数: 二进制转换成十进制:v = "0b1111011" # int(v,2) 十进制转换成二进制:v = 18 # ...
- 学以致用三十-----pycharm创建django项目忘记添加app
记忆力有时候真的不是很好.因此有些操作步骤还是记录下来好了. pycharm版本-----2018.2.4 创建django项目 file-----newproject----- 创建的时候,appl ...
- REdis Asynchronous AOF fsync is taking too long
redis.conf中的no-appendfsync-on-rewrite默认值为no,表示在重写AOF文件或RDB文件时阻塞fsync. 如果重写AOF或RDB文件时长过长,则在日志中可以看到如下信 ...
- java.lang.RuntimeException: Invalid action class configuration that references an unknown class name
---恢复内容开始--- 转自 : https://www.cnblogs.com/javawebsoa/archive/2013/05/25/3098190.html java.lang.Runti ...
- VS中Debug与Release、_WIN32与_WIN64的区别
一.Debug与Release 1. 区别 Debug——调试版,生成的.exe中包含很多调试信息,若直接发包,比较大: Release——发布版 2. 如何区分是Debug编译还是Release ...
- <笔记>原生PHP访问TP模板变量
在模板中,原生PHP可以直接访问模板变量,不过如果模板变量是数组,要访问数组中元素时不能使用"."符号,只能通过数组['元素名']的方式
- python基础自学 第四天
break和continue break:某一条件满足,退出循环,不在执行后续重复代码 continue:某一条件满足时,不执行后续重复的代码 注意:在循环中,如果使用continue这个关键字,使用 ...