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 ...
随机推荐
- 基于HTML5 Canvas的CSG构造实体几何书架
CSG 构造实体几何这个概念在工业水利水电施工上.游戏上已经有很多人使用了,最简单的实体表示叫作体元,通常是形状简单的物体,如立方体.圆柱体.棱柱.棱锥.球体.圆锥等.根据每个软件包的不同这些体元也有 ...
- Python爬虫入门:综述
大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...
- distcc (dcc_execvp) ERROR: failed to exec XX: Permission denied
首先先确保一下是不是能执行下面语句: # sudo -u nobody XX --version 如果能看见版本信息,则可以不用往下看. 再检查一下distccd.service # sudo cat ...
- jQuery DataTables 获取选中行数据
如题 想获取操作 DataTables 获取选中行数据 案1.主要是利用 js getElementsByTagName 函数 然后对获取到的tr 进行操作 如下 function getChec ...
- C# 程序集安装与卸载
下面我们来实现程序集的安装,代码如下: /// <summary>/// 程序集安装与卸载/// </summary>/// <param name="asse ...
- UNIX标准及实现
UNIX标准及实现 引言 在UNIX编程环境和C程序设计语言的标准化方面已经做了很多工作.虽然UNIX应用程序在不同的UNIX操作系统版本之间进行移植相当容易,但是20世纪80年代UNIX版本 ...
- [转]Oracle执行计划详解
Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介: ...
- TCP网络程序实例——服务器端与客户端交互
实例02 客户端/服务器的交互 实例位置:光盘\Code\SL\14\02 视频位置:光盘\Video\14\ ◆ 服务器端 创建服务器端项目Server,在Main方法中创建TCP连接对象:然后监听 ...
- 插入排序-Python与PHP实现版
插入排序Python实现 import random a=[random.randint(1,999) for x in range(0,36)] # 直接插入排序算法 def insertionSo ...
- C#表达式目录树(Expression)
1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression) 2.用Lambda声明表达式目录树: Expression<Func<; //表达试目录树的方 ...