poj1151Atlantis(离散化+扫描线)
http://poj.org/problem?id=1151
http://www.cnblogs.com/kane0526/archive/2013/02/26/2934214.html这篇博客写的不错 主要是图画的不错
求面积并 离散化后 通过添加矩形的x方向边 用线段树不断更新(要求的分割开的)矩形的长和宽
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 5050
using namespace std;
struct node
{
double lx,rx,y;
int s;
node(){}
node(double a,double b,double c,int d):lx(a),rx(b),y(c),s(d){}
bool operator < (const node &S) const
{
return y<S.y;
}
}mat[maxn];
double que[maxn],sum[maxn];
int cnt[maxn];
int bin(double x,int n)
{
int s,e,m;
s=;e=n;
while(s<=e)
{
m = (s+e)/;
if(que[m]==x)
return m;
else if(que[m]>x)
e = m-;
else
s = m+;
}
return m;
}
void pushup(int l,int r,int w)
{
if(cnt[w])
sum[w] = que[r+]-que[l];
else if(l==r)
sum[w] = ;
else
sum[w] = sum[w<<]+sum[w<<|];
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
cnt[w]+=d;
pushup(l,r,w);
return ;
}
int m = (l+r)>>;
if(a<=m)
update(a,b,d,l,m,w<<);
if(b>m)
update(a,b,d,m+,r,w<<|);
pushup(l,r,w);
}
int main()
{
int i,k,n,cas=;
double a,b,c,d;
while(cin>>n)
{
if(n==) break;
int num = ;
for(i = ; i <= n ; i++)
{
cin>>a>>b>>c>>d;
que[num] = a;
mat[num++]=node(a,c,b,);
que[num] = c;
mat[num++] = node(a,c,d,-);
}
sort(que,que+num);
sort(mat,mat+num);
k = ;
for(i = ; i < num ; i++)
{
if(que[i]!=que[i-])
que[k++] = que[i];
}
double ans=;
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
for(i = ; i < num- ; i++)
{
int l = bin(mat[i].lx,k-);
int r = bin(mat[i].rx,k-)-;
if(l<=r)
update(l,r,mat[i].s,,k-,);
ans+=sum[]*(mat[i+].y-mat[i].y);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",cas++,ans);
}
return ;
}
poj1151Atlantis(离散化+扫描线)的更多相关文章
- hdu1542 矩形面积并(线段树+离散化+扫描线)
题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- POJ_3470 Walls 【离散化+扫描线+线段树】
一.题面 POJ3470 二.分析 POJ感觉是真的老了. 这题需要一些预备知识:扫描线,离散化,线段树.线段树是解题的关键,因为这里充分利用了线段树区间修改的高效性,再加上一个单点查询. 为什么需要 ...
- HDU 5862 Counting Intersections (离散化+扫描线+树状数组)
题意:给你若干个平行于坐标轴的,长度大于0的线段,且任意两个线段没有公共点,不会重合覆盖.问有多少个交点. 析:题意很明确,可是并不好做,可以先把平行与x轴和y轴的分开,然后把平行y轴的按y坐标从小到 ...
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...
- HDU-1542 Atlantis(离散化+扫描线)
题目大意:给n个矩形,可能重叠,求面积. 题目分析:线段树维护扫描线. 代码如下: # include<bits/stdc++.h> using namespace std; # defi ...
- poj 1151 Atlantis (离散化 + 扫描线 + 线段树 矩形面积并)
题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 映射到y轴,并且记录下每个的y坐标,并对y坐标进行离散. 然后按照x从左向右扫描. #include <io ...
随机推荐
- 如何在PowerDesigner将PDM导出生成WORD文档或者html文件
a) 使用PowerDesigner打开pdm文件 b) 点击Report Temlates 制作模板 点击PowerDesigner菜单栏“Report” -> ...
- 弹性布局学习-详解 flex-direction【决定主轴的方向】(二)
弹性布局学习-详解 flex-direction[决定主轴的方向](二)
- undefined local variable or method ‘xxx’ for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xbc88d6c>错误解决方案
官方文档如下: https://github.com/rspec/rspec-rails/blob/master/Capybara.md Capybara 2.0 To use Capybara 2. ...
- 关于hadoop2.4.2版本学习时遇到的问题
问题一:namenode启动失败 描述:在初始化后hadoop后,发现datanode启动失败,namenode则可以正常启动,如果把用户换成root权限,再次启动时,则namenode和datano ...
- mysql_sql语句之美
无线地址及数量统计 单个用户无线登录信息统计
- 【转】用perl写的单位电脑信息采集程序
perl,后来我又改过了增加了一些交互和数据库检测的功能.主要用于收集ip.mac.姓名.房间,后来又加入了维修记录的功能.服务器端接受数据并存入数据库中. 代码如下: 主要用于收集ip.mac.姓名 ...
- @properties指针说明
在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, ...
- spring +hibernate 启动优化【转】
最近在负责一个大项目,项目组成员包括项目经理大概10个人左右.项目技术用struts+spring+hibernate实现.项目的规模相对来说是比较大的,总共有10大模块,每个大模块又分为有十几个.甚 ...
- jquery判断对象是否获得焦点
var isFocus=$("#tRow").is(":focus"); if(true==isFocus){ alert("focus") ...
- 团体程序设计天梯赛-练习集L1-008. 求整数段和
L1-008. 求整数段和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆 给定两个整数A和B,输出从A到B的所有整数以及这些 ...