Walk in the Park

题目连接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2222

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 扫描线的更多相关文章

  1. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  2. 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 ...

  3. CodeForces 209C Trails and Glades

    C. Trails and Glades time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  4. DICOM开源库

    转载于 http://blog.csdn.net/jackmacro/article/details/5850142 Developers used to search for libraries , ...

  5. in on at 总结

    in,on,at的时间用法和地点用法 一.in, on, at的时间用法 ①固定短语: in the morning/afternoon/evening在早晨/下午/傍晚, at noon/night ...

  6. 数据库 —— 使用JDBC操作数据库

    [Link] http://www.developer.com/java/data/manipulating-a-database-with-jdbc.html Manipulating a Data ...

  7. 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 ...

  8. 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 ...

  9. [转]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 ...

随机推荐

  1. [转]Linux的chattr与lsattr命令详解

    转自:http://www.cnblogs.com/yangxia-test/archive/2013/05/24/3096410.html 这两个命令是用来查看和改变文件.目录属性的,与chmod这 ...

  2. CAT XQX --- 省市三级级联实现说明

    最终效果: 满足要求, 上代码 : 1.   需要调用这个控件 的地方:添加引用,因为里面写着逻辑呢..... <script type="text/javascript" ...

  3. Ubuntu 16.04 TensorFlow CPU 版本安装

    1.下载Anaconda,官方网站.我下载的时Python 2.7 64bit版本: 2.安装执行命令     bash Anaconda2-4.2.0-Linux-x86_64.sh 设置好目录后等 ...

  4. ubuntu下Qt cannot find -lGL错误的解决方法 (转载)

    在ubuntu下使用Qt 编译时候遇上了cannot find -lGL错误,使用命令 sudo apt-get install libqt4-dev或者sudo apt-get install li ...

  5. Linux下U盘的挂载和文件的拷贝

    把文件通过U盘拷贝到linux系统下插好U盘后,查看磁盘情况fdisk -l正常情况下有 Disk /dev/sda:2045 MB,2045247488 bytes47 heads,46 secto ...

  6. BIOS启动项中的设备都有哪些

    Floppy 软式磁盘驱动器,简称FDD,也就是我们平时所说的软驱. CD-ROM 不用多说了,大家都知道,这是光盘驱动器,也就是我们平时说得光驱. SCSI SCSI的全名是:Small Compu ...

  7. mysql 用户权限

    创建用户 CREATE USER username IDENTIFIED BY 'password';

  8. c++声明与定义

    c++声明与定义 声明是将一个名称引入程序.定义提供了一个实体在程序中的唯一描述.声明和定义有时是同时存在的. 如 int  a; extern int b=1; 只有当extern中不存在初始化才是 ...

  9. Mellanox OFED2.1-X安装记录

    ---恢复内容开始--- 1,tcl,tk,gcc-gfortran,libnl-devel依赖包

  10. C 基于socket实现简单的文件传输

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAicAAAA5CAIAAABicRxIAAAgAElEQVR4nOy9Z5NVV5om+rzL773POW