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> # ...
随机推荐
- MsChart,饼状图
HTML 后台代码:(dt为数据源)数据库中数据Sample 1 Chart1.Series["Series1"].Label = "#PERCENT{P}"; ...
- 项目管理PMP输入输出ITTO联系记忆
综述九大领域 项目管理的输入输出非常难记,原因在于理解起来也经不去推敲,故整理一个联想记忆版本,通过联想把输入输出都串起来达到记忆的目的,既然是联想,里面的内容逻辑只是为了好记,并无正确与否,请大家原 ...
- Linux oracle数据库创建表空间、用户并赋予权限
管理员用户登录oracle数据库 1.创建临时表空间 select name from v$tempfile;查出当前数据库临时表空间,主要是使用里面的存放路径: 得到其中一条记录/opt/oracl ...
- jquery 复制文本到剪切板插件(非 flash)
原创插件,转载请声明出处!!! jquery.copy.js 内容如下: /*! * jQuery Copy Plugin * version: 1.0.0-2018.01.23 * Requires ...
- Ansible 远程执行命令
写法如下: [root@localhost ~]$ ansible 192.168.119.134 -m command -a 'date' # 对指定的主机远程执行命令,-m 指定使用哪个模块,-a ...
- 使用 Splash
Splash 简介与安装 Splash Lua 脚本 Splash 对象属性 Splash 对象方法 Splash API 调用 Splash 负载均衡
- 使用 urllib 处理 Cookies 信息
如何获取 Cookies : import urllib.request import http.cookiejar cookies = http.cookiejar.CookieJar() # 先声 ...
- NSIS安装vcredist_64.exe
; ExecWait ‘vcredist_x86.exe’ # 一般的安装ExecWait ‘”vcredist_x86.exe” /q’ # silent install 静默安装; ExecWai ...
- lua中的字符串操作(模式匹配)
(一). 模式匹配函数在string库中功能最强大的函数是:string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmat ...
- Linux配置示例:配置java环境变量
1.修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. (1)用文本编辑器打开/etc ...