cogs 1656. 膜拜神犇
1656. 膜拜神犇
★☆ 输入文件:trioxorz.in
输出文件:trioxorz.out
简单对比
时间限制:0.5 s 内存限制:128 MB
【题目描述】
bigmingod 是F.M.S信息组的组草,同时也是万人膜拜的神犇,整个年级暗恋他的女生不计其数,这让机房里的三只蒟蒻QYHDS,LZK,OIdiot羡慕嫉妒恨。为了获得像bigmingod一样的成就,这三只蒟蒻决定每次竞赛课前对他进行膜拜——三个人构成一个三角形,将bigmingod包围在内部(不包括边上),称为膜拜成功!
然而蒟蒻也许跟不上神犇的脚步,若没能包围bigmingod,则为膜拜失败。如图所示:
现在给你N次的膜拜情况,请你编程输出膜拜成功的次数。
【输入格式】
第一行为一个正整数N表示膜拜的次数。
以下N行,每行 6 个数字,x1,y1,x2,y2,x3,y3 即三角形顶点的坐标。
【输出格式】
一个整数,即膜拜成功的次数。
【样例输入】
3
-1 0 0 -1 0 1
-1 1 2 -2 1 2
-2 2 -1 -5 10 6
【样例输出】
1
【数据范围】
N ≤300000。
坐标绝对值均小于1000,且保证不会出现三点共线或重合的点。
【来源】
F.M.S in Changsha
Solution:
这题其实非常水,因为bigmingod在(0,0)所以只有当三个点所代表的向量的夹角都为锐角时才满足条件。其实就是前两个叉乘同号,最后一个叉乘和前两个异号。当然还有一种做法就是把每一个解析式求出来,再随表从(0,0)引一条射线,看射线和几个函数图像再两点之间相交,如果这个个数为奇数则说明点在区域内,否则不合法。但是本蒟蒻只打了60分,另外40不是精度问题就是随机选取的射线有问题,有可能出现重合现象。用int,double会死一个点。
1 #include<cstdio> 2 #define eps 1e-10 3 using namespace std; 4 int x1,y1,x2,y2,x3,y3; 5 int n,ans; 6 int main(){ 7 freopen("trioxorz.in","r",stdin); 8 freopen("trioxorz.out","w",stdout); 9 scanf("%d",&n); 10 while(n--) { 11 scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3); 12 int ans1=x1*y2-y1*x2; 13 int ans2=x2*y3-y2*x3; 14 int ans3=x1*y3-y1*x3; 15 if(ans1>0&&ans2>0&&ans3<0){ 16 ans++; 17 }else{ 18 if(ans1<0&&ans2<0&&ans3>0){ 19 ans++; 20 } 21 } 22 } 23 printf("%d\n",ans); 24 return 0; 25 }