hdu 4643(计算几何)
题意:容易理解
分析:切换的地点为两个基站所在直线的中垂线与两座城市所在直线的交点。
代码实现:
#include <cstdio>
#include <cmath>
#include <algorithm>
#define maxn 60
#define eps 1e-7
using namespace std;
int dcmp(double x) //控制精度
{
if(fabs(x)<eps) return ;
else return x<?-:;
}
double toRad(double deg) //角度转弧度
{
return deg/180.0*acos(-1.0);
}
struct Point
{
double x,y;
Point(){}
Point(double x,double y):x(x),y(y) {}
void input()
{
scanf("%lf %lf",&x,&y);
}
};
typedef Point Vector;
Vector operator+( Vector A, Vector B ) //向量加
{
return Vector( A.x + B.x, A.y + B.y );
}
Vector operator-(Vector A,Vector B) //向量减
{
return Vector( A.x - B.x, A.y - B.y );
}
Vector operator*( Vector A, double p ) //向量数乘
{
return Vector( A.x * p, A.y * p );
}
Vector operator/( Vector A, double p ) //向量数除
{
return Vector( A.x / p, A.y / p );
}
bool operator<(const Point& A, const Point& B ) //两点比较
{
return dcmp( A.x - B.x ) < || ( dcmp( A.x - B.x ) == && dcmp( A.y - B.y ) < );
}
bool operator==( const Point& a, const Point& b ) //两点相等
{
return dcmp( a.x - b.x ) == && dcmp( a.y - b.y ) == ;
}
struct Line
{
Point s,e;
Vector v;
Line() {}
Line(Point s,Point v,int type)://法向量式
s(s),v(v){}
Line(Point s,Point e):s(s),e(e)//两点式
{v=e-s;} };
double Dot(Vector A,Vector B)//向量点乘
{
return A.x*B.x+A.y*B.y;
}
double Length(Vector A)//向量模
{
return sqrt(Dot(A,A));
}
double Angle(Vector A,Vector B)//向量夹角
{
return acos(Dot(A,B)/Length(A)/Length(B));
}
double Cross(Vector A,Vector B)//向量叉积
{
return A.x*B.y-A.y*B.x;
}
double Area2(Point A,Point B,Point C )//向量有向面积
{
return Cross(B-A,C-A);
}
double Dist(Point A,Point B)
{
return Length(A-B);
}
Vector Rotate(Vector A, double rad)//向量逆时针旋转
{
return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}
Vector Normal(Vector A)//向量单位法向量
{
double L=Length(A);
return Vector(-A.y/L,A.x/L);
}
Point GetLineIntersection(Line l1,Line l2)//两直线交点
{
Point P=l1.s;
Vector v=l1.v;
Point Q=l2.s;
Vector w=l2.v;
Vector u=P-Q;
double t=Cross(w,u)/Cross(v,w);
return P+v*t;
}
double DistanceToLine(Point P,Line L)//点到直线的距离
{
Point A,B;
A=L.s,B=L.e;
Vector v1=B-A,v2=P-A;
return fabs(Cross(v1,v2))/Length(v1);
}
double DistanceToSegment(Point P, Line L)//点到线段的距离
{
Point A,B;
A=L.s,B=L.e;
if(A==B) return Length(P-A);
Vector v1=B-A,v2=P-A,v3=P-B;
if (dcmp(Dot(v1,v2))<) return Length(v2);
else if (dcmp(Dot(v1,v3))>) return Length(v3);
else return fabs(Cross(v1,v2)) / Length(v1);
}
Point GetLineProjection(Point P,Line L)// 点在直线上的投影
{
Point A,B;
A=L.s,B=L.e;
Vector v=B-A;
return A+v*(Dot(v,P-A)/Dot(v,v));
}
bool OnSegment(Point p,Line l)//点在线段上包括端点
{
Point a1=l.s;
Point a2=l.e;
return dcmp(Cross(a1-p,a2-p))==&&dcmp(Dist(p,a1)+Dist(p,a2)-Dist(a1,a2))==;
}
bool Paralled(Line l1,Line l2)//直线平行
{
return dcmp(Cross(l1.e-l1.s,l2.e-l2.s))==;
}
bool SegmentProperIntersection(Line l1,Line l2)//线段相交
{
if(Paralled(l1,l2))
{
return false;
}
Point t=GetLineIntersection(l1,l2);
if(OnSegment(t,l1))
{
return true;
}
return false;
}
int ConvexHull(Point *p,int n,Point *ch) //求凸包
{
sort(p,p+n);
int m=;
for ( int i = ; i < n; ++i )
{
while ( m > && Cross( ch[m - ] - ch[m - ], p[i] - ch[m - ] ) <= ) --m;
ch[m++] = p[i];
}
int k = m;
for ( i = n - ; i >= ; --i )
{
while ( m > k && Cross( ch[m - ] - ch[m - ], p[i] - ch[m - ] ) <= ) --m;
ch[m++] = p[i];
}
if ( n > ) --m;
return m;
}
double PolygonArea(Point *p,int n) //多边形有向面积
{
double area=;
for (int i=;i<n-;++i)
area+=Cross(p[i]-p[],p[i+]-p[]);
return area/2.0;
}
///*******************************************************/// int N,M,Q;
Point city[maxn],base[maxn]; int solve(int a,int b)
{
Line train=Line(city[a],city[b]);
int res=;
int i,j,k;
for(i=; i<M; i++)
{
for(j=i+; j<M; j++)
{
Line vert=Line((base[i]+base[j])/,Normal(base[i]-base[j]),);
if(Paralled(train,vert))
{
// printf("caonima\n");
continue;
}
Point t=GetLineIntersection(train,vert);
if(!OnSegment(t,train)) continue;
double d1=Dist(t,base[i]); int flag=;
for(k=;k<M;k++)
{
if(k==i||k==j) continue;
double d2=Dist(t,base[k]);
if(dcmp(d2-d1)<)
{
flag=;
break;
}
}
if(flag)
{
res++;
}
}
}
return res;
}
int main()
{
//freopen("input.txt","r",stdin);
int i,j;
while(scanf("%d %d",&N,&M)==)
{
for(i=; i<N; i++)
{
city[i].input();
}
for(i=; i<M; i++)
{
base[i].input();
}
scanf("%d",&Q);
while(Q--)
{
int a,b;
scanf("%d %d",&a,&b);
a--,b--;
printf("%d\n",solve(a,b));
}
}
return ;
}
hdu 4643(计算几何)的更多相关文章
- hdu 4643 GSM 计算几何 - 点线关系
/* hdu 4643 GSM 计算几何 - 点线关系 N个城市,任意两个城市之间都有沿他们之间直线的铁路 M个基站 问从城市A到城市B需要切换几次基站 当从基站a切换到基站b时,切换的地点就是ab的 ...
- HDU 4643 GSM 简单计算几何
今天比赛的时候略坑, admin告诉我询问Q的个数不超过n^2, 赛后敲了个 O(Q*m^3)的复杂度,但这个复杂度常数比较低,可能在除以个小常数, 300ms过了,真心无语,数据应该水了吧,比赛的时 ...
- HDU 4643 GSM (2013多校5 1001题 计算几何)
GSM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submiss ...
- hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- *HDU 2108 计算几何
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 5784 (计算几何)
Problem How Many Triangles (HDU 5784) 题目大意 给定平面上的n个点(n<2000),询问可以组成多少个锐角三角形. 解题分析 直接统计锐角三角形较困难,考虑 ...
- hdu 4720 计算几何简单题
昨天用vim练了一道大水题,今天特地找了道稍难一点的题.不过也不是很难,简单的计算几何而已.练习用vim编码,用gdb调试,结果居然1A了,没调试...囧... 做法很简单,无非就是两种情况:①三个巫 ...
- HDU 6205[计算几何,JAVA]
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=6206] 题意: 给出不共线的三个点,和一个点(x,y),然后判断(x,y)在不在这三个点组成的圆外. ...
随机推荐
- CF A. Xenia and Divisors
题目大意: n(为三的倍数)个数的一个序列(每个数均不大于7),找出a,b,c a能被b整除,b能被c整除,序列中的每个数都被用到. 1 2 3 4 5 6 7 只有 1 2 4 1 2 6 1 3 ...
- Java-J2SE学习笔记-查找一个String中,subString的出现次数
1.查找一个String中,subString的出现次数 2.代码 package Test; public class TestStringContain { public static void ...
- 瞬态电压抑制二极管(TVS)选用原则
在选用瞬态电压抑制二极管(TVS)时,必须考虑电路的具体条件,一般应遵循以下原则: 一.大箝位电压Vc(MAX)不大于电路的最大允许安全电压. 二.最大反向工作电压(变位电压)VRWM不低于电路的最大 ...
- android 点九PNG技术 适应不同分辨率 完美显示效果
.9.png是一种非失真性压缩位图图形文件格式.PNG格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性.现在有很多人使用PNG格式于互联网及 ...
- Heap和Heapify
最近复习数据结构,又回去再看塞神的课件,看到PriorityQueue的实现.自己也根据塞神的代码写一写. 下面使用Binary Heap实现了一个简单的 Max-oriented PriorityQ ...
- POJ1088滑雪
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 311. Sparse Matrix Multiplication
题目: Given two sparse matrices A and B, return the result of AB. You may assume that A's column numbe ...
- SSIS ->> Null & Null Functions
SSIS不支持值为NULL的变量.每种类型的变量都有自己的默认值. 做了一个测试,用一个Execute SQL Task输出一个NULL值给A变量,然后把A变量传到到另外一个Execute SQL T ...
- sourceforge.net 打不开怎么办?(转)
sourceforge.net 打不开怎么办?找个镜像地址下吧! 笔者试了下这个地址,可以打开 http://www.mirrorservice.org/sites/download.source ...
- C#中的转换
11.3 转换 到目前为止,在需要把一种类型转换为另一种类型时,使用的都是类型转换.而这并不是唯一的方式. 在计算过程中,int可以采用相同的方式隐式转换为long或double,还可以定义所创建的 ...