poj 3168 Barn Expansion 几何yy
题链:http://poj.org/problem?
id=3168
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 2087 | Accepted: 544 |
Description
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.
题意:给若干个矩形,直接仅仅有接触,没有重叠。计算出有多少矩形是不和其它矩形有接触。
做法:
把两条横向边和纵向边分解开来。各自存入数组 hh,和ss。
然后排序。以横向为例。先按高度排序,高度同样的 按左边的坐标从小到大排序。
然后for一遍,注意下推断重合时,之前的那个矩形pre也要标记成有接触。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map> struct point
{
int s,x,id;//下 左 负
int z,y;
point()
{}
point(int _x,int _s,int _z,int _y,int _id)
{
s=_s,x=_x,z=_z,y=_y,id=_id;
}
};
point hh[1000010]; //放横的
point ss[1001000];
int has[26000];
int cmph(point a,point b)
{
if(a.s!=b.s)
return a.s<b.s;
return a.z<b.z;
}
int cmps(point a,point b)
{
if(a.z!=b.z)
return a.z<b.z;
return a.x<b.x;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(has,0,sizeof has);
int h=0;
int s=0;
for(int i=0;i<n;i++)
{
int l,x,r,sh;
scanf("%d%d",&l,&x);
scanf("%d%d",&r,&sh);
hh[h++]=point(x,x,l,r,i);
hh[h++]=point(sh,sh,l,r,i); ss[s++]=point(x,sh,l,l,i);
ss[s++]=point(x,sh,r,r,i);
}
sort(hh,hh+h,cmph);
sort(ss,ss+s,cmps);
int z,y;
int pre;
for(int i=0;i<h;i++)
{
if(i==0)
{
z=hh[i].z;
y=hh[i].y;
pre=hh[i].id;
}
else if(hh[i-1].s==hh[i].s)
{
if(hh[i].z<=y) //在之前的范围内
{
has[pre]=1;
has[hh[i].id]=1;
}
else //不在之前范围内
{
z=hh[i].z;
y=hh[i].y;
pre=hh[i].id;
}
if(hh[i].y>y)//扩展右边
y=hh[i].y;
}
else//不在一个高度时
{
z=hh[i].z;
y=hh[i].y;
pre=hh[i].id;
}
}
int xi,sh;
for(int i=0;i<=s;i++)
{
// printf("x%d s%d l%d id%d\n",ss[i].x,ss[i].s,ss[i].z);
if(i==0)
{
xi=ss[i].x;
sh=ss[i].s;
pre=ss[i].id;
}
else if(ss[i-1].y==ss[i].y)
{
if(ss[i].x<=sh)
{
has[ss[i].id]=1;
has[pre]=1;
}
else
{
xi=ss[i].x;
sh=ss[i].s;
pre=ss[i].id;
}
if(ss[i].s>sh)
sh=ss[i].s;
}
else
{
xi=ss[i].x;
sh=ss[i].s;
pre=ss[i].id;
}
}
int ans=0;
for(int i=0;i<n;i++)
{
if(has[i])
{
// printf("id%d ",i);
ans++;
}
}
printf("%d\n",n-ans);
}
return 0;
}
/*
8 4
4 1 0 0 0 0 1 0
0 0 0 1 0 1 0 0
0 2 1 1 3 0 4 0
0 0 0 4 1 1 1 0
*/
poj 3168 Barn Expansion 几何yy的更多相关文章
- POJ 3168 Barn Expansion (几何+排序)
题目链接:id=3168">POJ 3168 Barn Expansion 题意:抽象出来就是给出n个矩形的坐标是(左下角和右上角的坐标,矩形的边都是平行x,y轴),问有几个矩形和其它 ...
- poj 3168 Barn Expansion
Barn Expansion Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2465 Accepted: 666 Des ...
- POJ 3168 Barn Expansion (几何基础)
[题目链接] http://poj.org/problem?id=3168 [题目大意] 给出一些矩形,没有相交和包含的情况,只有相切的情况 问有多少个矩形没有相切或者边角重叠 [题解] 我们将所有的 ...
- poj 3233 矩阵快速幂+YY
题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角 ...
- poj 3734 矩阵快速幂+YY
题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中 ...
- poj3168 Barn Expansion【计算几何 平面扫描】
Farmer John has N (1 <= N <= 25,000) rectangular barns on his farm, all with sides parallel to ...
- POJ 2546 Circular Area 几何
http://poj.org/problem?id=2546 晚上发现鼠标快不行了了!!!鼠标你肿么了,肿么突然就按键不灵了,哭,谁送我一只呀,奖励我舍友一只.哈哈.开玩笑滴~ 舍友大怒说" ...
- POJ - 1127 Jack Straws(几何)
题意:桌子上放着n根木棍,已知木棍两端的坐标.给定几对木棍,判断每对木棍是否相连.当两根木棍之间有公共点或可以通过相连的木棍间接的连在一起,则认为是相连的. 分析: 1.若线段i与j平行,且有部分重合 ...
- poj 1701【数学几何】
The area Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- 虚拟软件vmware安装
什么是虚拟软件: 虚拟原件是一个可以使你在一台机器上同时运行二个或更多Windows.LINUX等系统.它可以模拟一个标准PC环境.这个环境和真实的计算机一样,都有芯片组.CPU.内存.显卡.声卡.网 ...
- Java反射机制使用场景
import java.io.*; import java.util.Properties; /*问题描述:存在一个主板--已经定义好,不想修改其代码,还想在主板上面增加一些其他功能? *问题解决方法 ...
- Docker安装和卸载
一:卸载旧版本 老版本的Docker被称为docker或docker-engine.如果安装了这些,请卸载它们以及相关的依赖项. $ sudo yum remove docker \ docker-c ...
- Maven2的配置文件settings.xml
简介: 概览 当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置.这包含 ...
- [S]SQL SERVER数据库维护与重建索引
第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100% declare @table_id int set @table_id=object_id('表名') dbcc sho ...
- SQL 之存储过程
存储过程 是用来执行管理任务或应用复杂的业务规则, 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 存储过程的优点 存储过程已在服务器注册 执 ...
- T-SQL的进阶:超越基本级别3:构建相关子查询——701小组
T-SQL的进阶:超越基本级别3:构建相关子查询 格雷戈里·拉森,2014/03/05 原文链接: http://www.sqlservercentral.com/articles/Stairway+ ...
- 搭建php环境的几种方法
对于想学习php开发初学者来说,先要学习搭建php开发环境,因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境软件非常复杂,好在很多公司开发了一键搭建php安装环境, ...
- androidStudio 中 gradle 常用功能
1. gradle 使用 svn 当前版本信息. def getSvnRevision() { new ByteArrayOutputStream().withStream { os -> de ...
- android 开源收藏
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...