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 ...
随机推荐
- Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡 (负载均衡算法:nginx负载算法 up ...
- c#枚举自定义,用于数据绑定。 z
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Enum)] public ...
- HDU5807 Keep In Touch (BestCoder Round #86 D ) 分布式dp
#include <cstdio> #include <cstring> #include <cmath> #include <vector> #inc ...
- 第二个UI脚本--Python+selenium之unittest+HTMLtestRunner及python的继承
前面有一篇对于常见元素的识别和操作的python自动化脚本,这一篇就接着聊下python的类继承,已经它的第三款unittest框架,和报告收集包HTMLtestRunner的应用. 还是直接上代码吧 ...
- 自己写了一个类似百度空间自动保存草稿的程序 php+jquery
可以异步加载mysql中的草稿~,异步更新草稿列表~ 下载地址:http://download.csdn.net/source/3479156 代码: demo.php <?php mysql_ ...
- python中的多线程【转】
转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...
- Eclipse使用技巧总结
Eclipse设置工作空间的字符编码: 打开eclipse开发界面,依次点击Window->Preferences->General->Workspace 修改Text file e ...
- 单源最短路径的Bellman-Ford 算法
1.算法标签 BFS 2.算法概念 Bellman-Ford算法有这么一个先验知识在里面,那就是最短路径至多在N步之内,其中N为节点数,否则说明图中有负权值的回路,这样的图是找不到最短路径的.因此Be ...
- PHPCMS数据筛选功能实现
第一步:添加模型字段,这个模型可以是官方的,也可以是你自定义的模型,以单选字段形式添加就好了; 第二步:就是添加栏目和内容: 第三步:模板如下,照着改就好了. {template "cont ...
- BFS寻路算法的实现
关于BFS的相关知识由于水平有限就不多说了,感兴趣的可以自己去wiki或者其他地方查阅资料. 这里大概说一下BFS寻路的思路,或者个人对BFS的理解: 大家知道Astar的一个显著特点是带有启发函数, ...