[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 ...
随机推荐
- POJ 2777(线段树)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42507 Accepted: 12856 Des ...
- 2017 google Round C APAC Test 题解
题解参考网上的答案,以及我自己的想法. 主要参考网站:http://codeforces.com/blog/entry/47181,http://codeforces.com/blog/entry/4 ...
- [技术翻译]构建现代化的 Objective-C (上)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3561514.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- C#语法需要注意的地方
笔试中遇到的一些C#语法方面的问题,由于平时很少用到,笔试的时候模棱两可,现在做一个笔记. using System; using System.Collections.Generic; using ...
- Mac下修改默认的Java版本
今天在安装Elicpse IDE的时候,发现提示安装的Java版本不支持,于是在官方去下载了Jre最新版本并安装,在安装完过后再次打开Elicpse发现提示还是不正确,如果用Google查询到一些资料 ...
- linux系统制作简单流程
制作嵌入式平台使用的Linux内 核, 方法和制作PC平台 的Linux内 核基本一致, 下面使用 对比的方式介绍如何制作用 于6410开发板的内 核. 1. 清除原有配置与中间文件x86: make ...
- google map android api v2
我在这主要列举几个需要注意的问题: 1.需要注意使用的api版本的问题,例如google map android api v1就和v2差别很大,包括申请key方面,所以在搜索资料的时候一定注意版本问题 ...
- js实现瀑布流的一种简单方法实例分享
现在说瀑布流式布局似乎有点晚了,但是每一项技术都是向着“精”和“简”的方向在不断发展,在发展到极致之前,需要一个相当漫长的过程,因此,从这个角度来说,当瀑布流被应用得越来越多的时候,反而更应该讨论它, ...
- (转载)SQL语句导入导出大全
SQL语句导入导出大全 /******* 导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c ...
- Quartz Sheduler 入门
Quartz Sheduler 入门 原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/ 下载地址:http://qu ...