[POJ 1151] Atlantis
一样的题:HDU 1542
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 18148 | Accepted: 6902 |
Description
Input
The input file is terminated by a line containing a single 0. Don't process it.
Output
Output a blank line after each test case.
Sample Input
- 2
- 10 10 20 20
- 15 15 25 25.5
- 0
Sample Output
- Test case #1
- Total explored area: 180.00
- 求矩形并、线段树+扫描线
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define N 210
- int n;
- int tot;
- double sum;
- double y[N];
- double yl[N<<];
- double yr[N<<];
- int cover[N<<];
- double height[N<<];
- struct X
- {
- int pos;
- double x,y1,y2;
- bool operator <(const X &t)const
- {
- return x<t.x;
- }
- }x[N];
- void pushup(int l,int r,int rt)
- {
- if(cover[rt]>) height[rt]=yr[rt]-yl[rt];
- else if(l+==r) height[rt]=;
- else height[rt]=height[rt<<]+height[rt<<|];
- }
- void build(int l,int r,int rt)
- {
- cover[rt]=;
- yl[rt]=y[l];
- yr[rt]=y[r];
- if(l+==r) return;
- int m=(l+r)>>;
- build(l,m,rt<<);
- build(m,r,rt<<|);
- }
- void update(int l,int r,int rt,double L,double R,int c)
- {
- if(yl[rt]==L && yr[rt]==R)
- {
- cover[rt]+=c;
- pushup(l,r,rt);
- return;
- }
- int m=(l+r)>>;
- if(R<=y[m]) update(l,m,rt<<,L,R,c);
- else if(L>=y[m]) update(m,r,rt<<|,L,R,c);
- else
- {
- update(l,m,rt<<,L,y[m],c);
- update(m,r,rt<<|,y[m],R,c);
- }
- pushup(l,r,rt);
- }
- int main()
- {
- int i,iCase=;
- while(scanf("%d",&n),n)
- {
- tot=;
- sum=;
- memset(height,,sizeof(height));
- for(i=;i<n;i++)
- {
- double x1,y1,x2,y2;
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- y[tot]=y1;
- x[tot].x=x1;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=;
- y[tot]=y2;
- x[tot].x=x2;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=-;
- }
- sort(x,x+tot);
- sort(y,y+tot);
- build(,tot-,);
- for(i=;i<tot;i++)
- {
- update(,tot-,,x[i-].y1,x[i-].y2,x[i-].pos);
- sum+=height[]*(x[i].x-x[i-].x);
- }
- printf("Test case #%d\nTotal explored area: %.2f\n\n",iCase++,sum);
- }
- return ;
- }
一样的题:POJ 1389
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3193 | Accepted: 1627 |
Description
Assume that the contour of their union is defi ned by a set S of segments. We can use a subset of S to construct simple polygon(s). Please report the total area of the polygon(s) constructed by the subset of S. The area should be as large as possible. In a 2-D xy-plane, a polygon is defined by a finite set of segments such that every segment extreme (or endpoint) is shared by exactly two edges and no subsets of edges has the same property. The segments are edges and their extremes are the vertices of the polygon. A polygon is simple if there is no pair of nonconsecutive edges sharing a point.
Example: Consider the following three rectangles:
rectangle 1: < (0, 0) (4, 4) >,
rectangle 2: < (1, 1) (5, 2) >,
rectangle 3: < (1, 1) (2, 5) >.
The total area of all simple polygons constructed by these rectangles is 18.
Input
Output
Sample Input
- 0 0 4 4
- 1 1 5 2
- 1 1 2 5
- -1 -1 -1 -1
- 0 0 2 2
- 1 1 3 3
- 2 2 4 4
- -1 -1 -1 -1
- -1 -1 -1 -1
Sample Output
- 18
- 10
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define N 210
- int n;
- int tot;
- double sum;
- double y[N];
- double yl[N<<];
- double yr[N<<];
- int cover[N<<];
- double height[N<<];
- struct X
- {
- int pos;
- double x,y1,y2;
- bool operator <(const X &t)const
- {
- return x<t.x;
- }
- }x[N];
- void pushup(int l,int r,int rt)
- {
- if(cover[rt]>) height[rt]=yr[rt]-yl[rt];
- else if(l+==r) height[rt]=;
- else height[rt]=height[rt<<]+height[rt<<|];
- }
- void build(int l,int r,int rt)
- {
- cover[rt]=;
- yl[rt]=y[l];
- yr[rt]=y[r];
- if(l+==r) return;
- int m=(l+r)>>;
- build(l,m,rt<<);
- build(m,r,rt<<|);
- }
- void update(int l,int r,int rt,double L,double R,int c)
- {
- if(yl[rt]==L && yr[rt]==R)
- {
- cover[rt]+=c;
- pushup(l,r,rt);
- return;
- }
- int m=(l+r)>>;
- if(R<=y[m]) update(l,m,rt<<,L,R,c);
- else if(L>=y[m]) update(m,r,rt<<|,L,R,c);
- else
- {
- update(l,m,rt<<,L,y[m],c);
- update(m,r,rt<<|,y[m],R,c);
- }
- pushup(l,r,rt);
- }
- int main()
- {
- int i;
- while()
- {
- tot=;
- sum=;
- memset(height,,sizeof(height));
- n=;
- double x1,y1,x2,y2;
- while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2) && x1+x2+y1+y2!=-)
- {
- y[tot]=y1;
- x[tot].x=x1;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=;
- y[tot]=y2;
- x[tot].x=x2;x[tot].y1=y1;x[tot].y2=y2;x[tot++].pos=-;
- n++;
- }
- if(n==) break;
- sort(x,x+tot);
- sort(y,y+tot);
- build(,tot-,);
- for(i=;i<tot;i++)
- {
- update(,tot-,,x[i-].y1,x[i-].y2,x[i-].pos);
- sum+=height[]*(x[i].x-x[i-].x);
- }
- printf("%.0f\n",sum);
- }
- return ;
- }
[POJ 1151] Atlantis的更多相关文章
- POJ 1151 Atlantis(扫描线)
题目原链接:http://poj.org/problem?id=1151 题目中文翻译: POJ 1151 Atlantis Time Limit: 1000MS Memory Limit: 10 ...
- POJ 1151 Atlantis 矩形面积求交/线段树扫描线
Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...
- POJ 1151 Atlantis(线段树-扫描线,矩形面积并)
题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...
- POJ 1151 Atlantis (扫描线+线段树)
题目链接:http://poj.org/problem?id=1151 题意是平面上给你n个矩形,让你求矩形的面积并. 首先学一下什么是扫描线:http://www.cnblogs.com/scau2 ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- POJ 1151 Atlantis 线段树+离散化+扫描线
这次是求矩形面积并 /* Problem: 1151 User: 96655 Memory: 716K Time: 0MS Language: G++ Result: Accepted */ #inc ...
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
- POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)
求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...
- poj 1151 Atlantis (离散化 + 扫描线 + 线段树 矩形面积并)
题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 映射到y轴,并且记录下每个的y坐标,并对y坐标进行离散. 然后按照x从左向右扫描. #include <io ...
随机推荐
- 数据库不能用delete---index空间不足
只有0702表是这样的情况,0101表可以使用like和between and
- 此一生 一个纯js的ajax
/** * 得到ajax对象 */ function getajaxHttp() { var xmlHttp; try { // Firefox, Opera 8.0+, Safari xmlHttp ...
- iOS 成员变量的作用范围
/* 成员变量的作用范围: @public:在任何地方都能直接访问对象的成员变量 @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法 @protecte ...
- 在Mac OS X中使用VIM开发STM32(2)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在我先前的博文⎣在Mac OS X中使用VIM开发STM32(1)⎤中,我们安装完成了MACVIM,这一 ...
- [可拖动DIV]刚开通博客顺便就写了点东西!
说说我自己的思路 首先需要一个初始div div { border: 1px #333 solid; width: 200px; height: 50px; } <div id="od ...
- 网站重构-你了解AJAX吗?
AJAX是时下最流行的一种WEB端开发技术,而你真正了解它的一些特性吗?--IT北北报 XMLHTTPRequest(XHR)是目前最常用的技术,它允许异步接收和发送数据,所有的主流浏览器都对它有不错 ...
- switch...case 和 if...else
switch...case与if...else的根本区别在于: switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的,switc ...
- 使用vagrant作为开发环境后,js报错
当你尝试修改一个js,并且用同样的方法更新之后,会遇到类似的问题,是的,就算重启VM上任何服务,甚至重启VM,依旧没有用,当然,比起其他资源文件,浏览器的反应会强烈一些,因为浏览器会提示未知错误,而你 ...
- YII2框架动态创建表模型
YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...
- Popen No such file or directory 错误
File , in reload_config stderr=PIPE, env={"PATH": '', "HOME": "/root"} ...