[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 ...
随机推荐
- [位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15
NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest. ...
- Pigcms中WeixinAction的简略版流程
if $this->ali = 0; 1.new wechat() //该类存于PigCms/lib/ORG/Wechat.class.php 2.list($content,$type) = ...
- 快速排序算法 Quick sort
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...
- DataTable 数据量大时,导致内存溢出的解决方案
/// <summary> /// 分解数据表 /// </summary> /// <param name="originalTab">需要分 ...
- Transaction的理解
Transaction的理解 待完善......
- win7定时任务
最近某app有个小抽奖,每天点击太麻烦,想做个定时任务访问抽奖链接(带着cookie登录信息,即可抽奖成功) 刚开始做了php,最后发现部署在百度bae中没法做定时任务每天执行,后来换成了python ...
- JS验证邮箱格式是否正确的代码
验证邮箱格式是否正确的方法有很多,接下来为大家介绍下使用js是如何做到的 复制代码代码如下: /* *验证邮箱格式是否正确 *参数strEmail,需要验证的邮箱 */ www.jbxue.co ...
- ECshop网点程序优化-自动生成类目页Keywords、Desciption Meta
ECshop支持针对每个新建的类目自定义Keywords.Description Meta信息,好处就不用说了,帮助SEO或者让浏览者了解这是什么页面,但如果有几百个类目的时候,人工去写这些类目又有点 ...
- LED字符设备驱动实例及测试代码
驱动代码如下: #include <linux/kernel.h>//内核头文件 #include <linux/init.h>//__init等 #include <l ...
- 【web安全】第二弹:XSS攻防中的复合编码问题
最近一直在研究XSS的攻防,特别是dom xss,问题慢慢的迁移到浏览器编码解码顺序上去. 今儿被人放鸽子,无奈在KFC看了两个小时的资料,突然有种豁然开朗的感觉. 参考资料先贴出来: 1. http ...