poj3168 Barn Expansion【计算几何 平面扫描】
and/or sides with other barns.
Since he has extra cows to milk this year, FJ would like to expand some of his barns. A barn has room to expand if it does not share a corner or a wall with any other barn. That is, FJ can expand a barn if all four of its walls can be pushed outward by at least
some amount without bumping into another barn. If two barns meet at a corner, neither barn can expand.
Please determine how many barns have room to expand.
Input
Lines 2..N+1: Four space-separated integers A, B, C, and D, describing one barn. The lower-left corner of the barn is at (A,B) and the upper right corner is at (C,D).
Output
Sample Input
5
0 2 2 7
3 5 5 8
4 2 6 4
6 1 8 6
0 0 8 1
Sample Output
2
Hint
There are 5 barns. The first barn has its lower-left corner at (0,2) and its upper-right corner at (2,7), and so on.
Only two barns can be expanded --- the first two listed in the input. All other barns are each in contact with at least one other barn.
思路:
把四条边拆开 存到两个数组里
排序 y方向的先按照x排 再按照y方向上的起点排
x方向同理
遍历 对于每一个点 所有loc和他相同的 看看在不在重合范围内 并且更新范围
对于这个点本身的计数要特别一点 不然会重复
用cin cout会T 还是不长记性哦
可能真的痛经痛傻了 洗洗睡了洗洗睡了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define PI 3.1415926
#define EPS 1.0e-6
struct Point {
Point(){}
Point(double x, double y, double z):x(x), y(y), z(z){}
double x,y, z;
};
struct rect{
Point left_bottom;
Point right_up;
};
struct barn{
int index;
int st, ed, loc;
}hh[500005], ll[500005];
bool cmp(barn a, barn b)
{
if(a.loc == b.loc)
return a.st < b.st;
return a.loc < b.loc;
}
int n, ans;
rect rec[25005];
bool vis[25005];
void solve(barn *bar, int n)
{
int i = 0;
while(i < n){
/*if(vis[bar[i].index]){
i++;
continue;
}*/
int pos = bar[i].loc;
int cnt = 0;
int first = i;
int ed = bar[i].ed;
i++;
while(i < n && bar[i].loc == pos && bar[i].st <= ed){
if(bar[i].ed > ed) ed = bar[i].ed;
if(!vis[bar[i].index]){
vis[bar[i].index] = true;
ans--;
}
cnt++;
i++;
}
if(cnt){
if(!vis[bar[first].index]){
vis[bar[first].index] = true;
ans--;
}
}
}
}
int main()
{
//while(cin>>n){
scanf("%d",&n);
ans = n;
//memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i++){
int left, bottom, right, up;
scanf("%d%d%d%d",&left, &bottom, &right, &up);
hh[2 * i].index = hh[2 * i + 1].index = i;
ll[2 * i].index = ll[2 * i + 1].index = i;
hh[2 * i].st = hh[2 * i + 1].st = bottom;
hh[2 * i].ed = hh[2 * i + 1].ed = up;
hh[2 * i].loc = left;hh[2 * i + 1].loc = right;
ll[2 * i].st = ll[2 * i + 1].st = left;
ll[2 * i].ed = ll[2 * i + 1].ed = right;
ll[2 * i].loc = bottom; ll[2 * i + 1].loc = up;
}
sort(hh, hh + 2 * n, cmp);
sort(ll, ll + 2 * n, cmp);
solve(hh, 2 * n);
solve(ll, 2 * n);
//int ans = 0;
//for(int i = 0; i < n; i++){
// if(!vis[i])ans++;
//}
printf("%d\n", ans);
//}
return 0;
}
poj3168 Barn Expansion【计算几何 平面扫描】的更多相关文章
- poj 3168 Barn Expansion
Barn Expansion Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2465 Accepted: 666 Des ...
- poj 3168 Barn Expansion 几何yy
题链:http://poj.org/problem? id=3168 Barn Expansion Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- POJ 3168 Barn Expansion (几何+排序)
题目链接:id=3168">POJ 3168 Barn Expansion 题意:抽象出来就是给出n个矩形的坐标是(左下角和右上角的坐标,矩形的边都是平行x,y轴),问有几个矩形和其它 ...
- POJ 2932 平面扫描 /// 判断圆的包含关系
题目大意: 平面上有n个两两不相交的圆,给定圆的圆心(x,y)和半径 r 求所有最外层的 即 不包含于其他圆内部的圆 挑战258页 平面扫描 记录所有圆的左端和右端 排序后 逐一扫描 将到当前圆为止的 ...
- 基于正向扫描的并行区间连接平面扫描算法(IEEE论文)
作者: Panagiotis Bouros ∗Department of Computer ScienceAarhus University, Denmarkpbour@cs.au.dkNikos M ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
- poj_3168 平面扫描
题目大意 给定平面上N个矩形的位置(给出矩形的左下角和右上角的坐标),这些矩形有些会有重叠,且重叠只会出现矩形的边重合全部或部分,矩形的顶点重合,而不会出现一个矩形的顶点位于另一个矩形的内部. ...
- POJ 3168 Barn Expansion (几何基础)
[题目链接] http://poj.org/problem?id=3168 [题目大意] 给出一些矩形,没有相交和包含的情况,只有相切的情况 问有多少个矩形没有相切或者边角重叠 [题解] 我们将所有的 ...
- TTTTTTTTTTTTTTT poj 2932 Coneology 平面扫描+STL
题目链接 题意:有n个圆,圆之间不存在相交关系,求有几个不被其他任何圆包含的圆,并输出圆的编号: #include <iostream> #include <cstdio> # ...
随机推荐
- pycharm 对代码做静态检查
对于下面这种情况,java c这些提前编译的语言,不给你运行机会就立马报错了,但对于动态语言运行之后才能报错,用运行的方法来检查代码错误是在是太坑了,这是py对比静态语言的巨大劣势,尤其是代码文件多行 ...
- 2、一、Introduction(入门):1、Application Fundamentals(应用程序基础)
一.Introduction(入门) 1.Application Fundamentals(应用程序基础) Android apps are written in the Java programmi ...
- Android 4.0以上BlurMaskFilter效果无效
Android MaskFilter的基本使用: MaskFilter类可以为Paint分配边缘效果. 对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换.An ...
- LHC大神问的矩阵转置问题
数学中线性代数中提到的矩阵转置,其实在我们的业务场景中也有需要的地方,比如LHC大神问到的这个问题 那么如何进行行列转换呢? 代码如下: <?php $array=array( '部门1'=&g ...
- mongodb命令(1)
成功启动MongoDB服务后,打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显 ...
- pgpool-II 的使用
1.pgpool-II的概念 pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能: 连接池 pgpool-II 保持已经连接 ...
- tablayout在中间显示
<android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_wid ...
- Python迭代器笔记
python中的三大器有迭代器,生成器,装饰器,本文重点讲解下迭代器的概念,使用,自定义迭代器等的介绍. 1.概念: 迭代器是一个对象,一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问 ...
- ip防刷脚本
#!/bin/sh #防刷脚本 #env ACCESS_PATH=/home/wwwlogs ACCESS_LOG=y.log IPTABLES_TOP_LOG=iptables_top.log DR ...
- 《C++ Primer Plus》16.3 标准模板库 学习笔记
STL提供了一组表示容器.迭代其.函数对象和算法的模板.容器是一个与数组类似的单元,可以存储若干个值.STL容器是同质的,即存储的值的类型相同:算法是完成特定任务(如对数组进行排序或在链表中查找特定值 ...