问题 G: Room
时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 8
[ 提交][ 状态][ 讨论版]
题目描述
The ACM / ICPC team has a large room, the length and width of which is 10^6 . However, the guys in ACM / ICPC teams are too lazy to make their study room tidy. So there are wires everywhere and divide the room into several parts. A team in a part of the room cannot move out of it or they might touch the wires and the network will down. To make every team can compete in the contest, they have to set up some facilities such as toilet since the teams should do anything in their parts. Now, we will give you the map of our study room and the position of the teams, your task is to calculate how many facilities is required to let every team can access a facilities to finish the contest without move out of their part. You should note that two or more teams can share a facility.
输入

输出
Output one integer, the minimal facilities required.
样例输入
3
0 200000 1000000 600000
600000 0 300000 1000000
0 800000 1000000 400000
9
200000 900000
200000 400000
300000 600000
600000 500000
700000 700000
800000 300000
300000 200000
800000 100000
600000 200000
样例输出
6
提示
#include <iostream>
#include <cstdio>
#include <cstring>
#include<string.h>
#include <algorithm>
#include<set>
#define ll long long
#define wtf printf("wtf");
using namespace std;
struct node
{
int x1,y1,x2,y2;
}e[100005];
struct xx
{
int x,y;
}p[105];
set<string>s;
ll check(node a,xx b)
{
ll A=a.y2-a.y1;
ll B=a.x1-a.x2;
ll C=(-B*a.y1-A*a.x1);
return A*b.x+B*b.y+C>0;
}
ll solve(ll n,ll t)
{
for(ll i=1;i<=t;i++)
{
string str="";
for(ll j=1;j<=n;j++)
str+=check(e[j],p[i])+'0';
s.insert(str);
}
return s.size();
}
int main()
{
ll n,t;
cin>>n;
for(ll i=1;i<=n;i++)
scanf("%lld%lld%lld%lld",&e[i].x1,&e[i].y1,&e[i].x2,&e[i].y2);
cin>>t;
for(ll i=1;i<=t;i++)
scanf("%lld%lld",&p[i].x,&p[i].y);
printf("%lld\n",solve(n,t));
return 0;
}