UVALive 4221 Walk in the Park 扫描线
Walk in the Park
题目连接:
Descriptionww.co
You are responsible for inspecting the trees located in a park, to make sure they remain healthy. The location of each tree is given to you as a point in the twodimensional plane, distinct from that of every other tree. Due to recentlyreplanted grass, you are only allowed to walk through the park along a collection of paths. Each path is described by an infinite-length horizontal or vertical line in the two-dimensional plane. No tree lies on any path.
You are concerned that it may not be possible to view all the trees in the park from the paths. In particular, a tree is visible only if you can view it by standing on some path while facing in a direction perpendicular to that path; there must be no intervening tree that obstructs your view. Given the geometrical configuration of the park, please report the number of visible trees.
Input
There will be multiple input sets. For each input set, the first line will contain two integers, N and M , ( 0 < N, M$ \le$100000 ), separated by a space. N is the number of trees, and M is the number of paths.
The next N lines each contain two space-separated integers, X and Y , specifying the coordinates of a tree. X and Y may be any 32-bit integers.
The next M lines each describe a path (a vertical or horizontal line). They have the form x = K or y = K , with no spaces. K may be any 32-bit integer. x and y will be lower case.
End of the input is signified by a line with two space-separated 0's.
Output
For each input set, print a single line containing one integer, specifying the number of visible trees. There should be no blank lines between outputs.
Sample Input
6 3
-1 3
4 2
6 2
6 3
6 4
4 3
x=0
y=-1
y=5
1 2
2 3
x=5
y=5
0 0
Sample Output
5
1
Hint
题意
在二维平面上有n棵树,然后有m条道路
你能看见这棵树的定义是,这棵树存在一条到垂直于道路的线上没有任何其他的树
然后问你最多能看到多少棵树
题解:
扫描线
我们分成四个步骤跑就好了
我们从x轴正半轴看过去能看到多少棵,负半轴看过去,能看到多少,从y轴正半轴看过去,负半轴看过去
每次我们用set来记录一下vis就好了
直接暴力扫一遍
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
inline long long read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m;
struct node
{
int x,y;
int flag;
int id;
};
node p[maxn];
node l[maxn];
set<int> S;
set<int> Ans;
bool cmp1(node a,node b)
{
return a.y<b.y;
}
bool cmp2(node a,node b)
{
return a.y>b.y;
}
bool cmp3(node a,node b)
{
return a.x<b.x;
}
bool cmp4(node a,node b)
{
return a.x>b.x;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
memset(p,0,sizeof(p));
memset(l,0,sizeof(l));
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&p[i].x,&p[i].y);
p[i].flag = 0;
p[i].id=i;
}
S.clear();
Ans.clear();
getchar();
for(int i=1;i<=m;i++)
{
char c = getchar();
getchar();
int p = read();
if(c=='x')
{
l[i].x=p;
l[i].flag=2;
}
else
{
l[i].y=p;
l[i].flag=1;
}
}
vector<node> V;
int first;
first = 1;
S.clear();
V.clear();
for(int i=1;i<=n;i++)
V.push_back(p[i]);
for(int i=1;i<=n;i++)
if(l[i].flag==1)
V.push_back(l[i]);
sort(V.begin(),V.end(),cmp1);
for(int i=0;i<V.size();i++)
{
if(V[i].flag==1)
{
S.clear();
first = 0;
}
else
{
if(first==1)continue;
if(S.count(V[i].x))
continue;
S.insert(V[i].x);
Ans.insert(V[i].id);
}
}
S.clear();
V.clear();
first = 1;
for(int i=1;i<=n;i++)
V.push_back(p[i]);
for(int i=1;i<=n;i++)
if(l[i].flag==1)
V.push_back(l[i]);
sort(V.begin(),V.end(),cmp2);
for(int i=0;i<V.size();i++)
{
if(V[i].flag==1)
{
S.clear();
first = 0;
}
else
{
if(first==1)continue;
if(S.count(V[i].x))
continue;
S.insert(V[i].x);
Ans.insert(V[i].id);
}
}
S.clear();
V.clear();
first = 1;
for(int i=1;i<=n;i++)
V.push_back(p[i]);
for(int i=1;i<=n;i++)
if(l[i].flag==2)
V.push_back(l[i]);
sort(V.begin(),V.end(),cmp3);
for(int i=0;i<V.size();i++)
{
if(V[i].flag==2)
{
first = 0;
S.clear();
}
else
{
if(first==1)continue;
if(S.count(V[i].y))
continue;
S.insert(V[i].y);
Ans.insert(V[i].id);
}
}
first = 1;
S.clear();
V.clear();
for(int i=1;i<=n;i++)
V.push_back(p[i]);
for(int i=1;i<=n;i++)
if(l[i].flag==2)
V.push_back(l[i]);
sort(V.begin(),V.end(),cmp4);
for(int i=0;i<V.size();i++)
{
if(V[i].flag==2)
{
first=0;
S.clear();
}
else
{
if(first==1)continue;
if(S.count(V[i].y))
continue;
S.insert(V[i].y);
Ans.insert(V[i].id);
}
}
printf("%d\n",Ans.size());
}
}
UVALive 4221 Walk in the Park 扫描线的更多相关文章
- hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)
Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- Codeforces 209 C. Trails and Glades
Vasya went for a walk in the park. The park has n glades, numbered from 1 to n. There are m trails b ...
- CodeForces 209C Trails and Glades
C. Trails and Glades time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- DICOM开源库
转载于 http://blog.csdn.net/jackmacro/article/details/5850142 Developers used to search for libraries , ...
- in on at 总结
in,on,at的时间用法和地点用法 一.in, on, at的时间用法 ①固定短语: in the morning/afternoon/evening在早晨/下午/傍晚, at noon/night ...
- 数据库 —— 使用JDBC操作数据库
[Link] http://www.developer.com/java/data/manipulating-a-database-with-jdbc.html Manipulating a Data ...
- CF Zepto Code Rush 2014 B. Om Nom and Spiders
Om Nom and Spiders time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- How to Avoid Producing Legacy Code at the Speed of Typing
英语不好翻译很烂.英语好的去看原文. About the Author I am a software architect/developer/programmer.I have a rather p ...
- [转]How to build a data storage and VM Server using comodity hardware and free software
Source: http://learnandremember.blogspot.jp/2010_01_01_archive.html Requisites: 1) RAID protection f ...
随机推荐
- Effective java笔记8--序列化
对象的序列化(object serialization)API,它提供了一个框架,用来将对象编码成一个字节流,以及从字节流编码中重新构建对象. 一.谨慎地实现Serializable 要想使一 ...
- 关于Activity的少许细节
1. 对活动应用样式和主题 2. 隐藏活动标题 3. 显示对话框窗口 4. 显示进度对话框 1. 应用样式和主题 改成 android:theme="@android:style/Th ...
- WS之cxf处理的复杂类型(Map)
一.服务端: 1.创建接口: package cn.tdtk.ws.dao; import java.util.List;import java.util.Map; import javax.jws. ...
- 20150926kaggle Titanic入门篇excel&python
1 excel数据透视表 这里主要是讲述了一下插入里面的数据透视表常用功能,数据透视表十分方便,比直接筛选还要简单,看数据很直观,这里大力推荐. 2 python&pandas 这里主要是讲述 ...
- 关于在 mac上配置pytesseract的相关问题
因为踩了两个小时坑 特别是在配置依赖tesseract-ORC识别库时候的问题 特别麻烦 一定要用brewhome 一定要用brewhome 一定要用brewhome 重要的事情说三遍. 刚开始我在网 ...
- LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt
十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...
- 個人最近做的最多的重複工作就是excel导出
//导出事件,这个是有合并动态列的 double num1 = 0, num2 = 0, num3 = 0; protected void btnExcel_Click(object sender, ...
- MYSQL数据库性能调优之三:explain分析慢查询
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.使用方法,在select语句前加上explain就可以了. 一.explain ...
- ubuntu 64位系统下加速Android模拟器
安装KVM: sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils 在Postfix Configurati ...
- windows下php cli模式,提示出错
搞一下php cli,一直提示,找不到php_pdo_mssql.dll模块 原来是在php.ini加载了该模块,但ext下又没有该模块 即便下载了一个php_pdo_mssql.dll,但还是会提示 ...