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 ...
随机推荐
- 基于opencv的手写数字识别(MFC,HOG,SVM)
参考了秋风细雨的文章:http://blog.csdn.net/candyforever/article/details/8564746 花了点时间编写出了程序,先看看效果吧. 识别效果大概都能正确. ...
- java中的Switch case语句
java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的 ...
- java 开发环境
jdk:包括jre,自己下载即可. 客户端只需安装jre即可. 安装路径:C:\jdk7.0\jdk1.7.0_25\bin (适时更改) 环境变量是从前往后找 测试成功:cmd java ...
- PySpark操作HBase时设置scan参数
在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算.翻遍了spark的python相关文档,搜遍了google和stackov ...
- poj 3299 Humidex
直接套公式就可以,可我套公式第一遍都错了,英语差的孩子伤不起(┬_┬) #include <iostream> #include <cmath> #include <io ...
- 【FFT】专题总结
学了若干天终于学(bei)会了传说中的法法塔 感觉也没那么难用嘛 fft快速傅里叶变换 在大表课件上写就是解决高精乘的工具 其实很有理有据 fft就是用复数的折半引理优化两个多项式相乘的高端东西 他能 ...
- openjdk sunjdk区别
使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢? 历史上的 ...
- python 字符串,数组,元祖操作基础巩固。
由于上个星期有点忙,没时间来抽空记一些有用的东西.丢了比较久的python很多忘记的小操作我也会重新捡起来 以前最容易搞混的 str.split() #操作会生成一个数组对象.example:'lap ...
- 第三百三十二天 how can I 坚持
今天一大早,住的这就施工了,被吵醒了.. 下午去了趟小米之家,小米5还行,黑科技不黑,哈哈. 小米5黑科技不太黑,就知道造词,整体感觉还行,就是感觉屏幕有点长,小米之家人倒是不少,还有老太太去小米之家 ...
- JNLP + Applet + Bouncy Castle
http://stackoverflow.com/questions/4275005/jnlp-applet-bouncy-castle ——————————————————————————————— ...