首页 > 代码库 > cogs 1656. 膜拜神犇

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不是精度问题就是随机选取的射线有问题,有可能出现重合现象。

 

 1 #include<cstdio>
 2 #define eps 1e-9
 3 using namespace std;
 4 double x1,y1,x2,y2,x3,y3;
 5 double abs(double x) {
 6     return x>0?x:(-x);
 7 }
 8 int n,ans;
 9 int main() {
10     scanf("%d",&n);
11     while(n--) {
12         scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
13         if((x1==x2&&x2==x3)||(y1==y2&&y2==y3)) {
14             continue;
15         }
16         if((x1==x2&&!x2)||(x1==x3&&!x1)||(x2==x3&&!x3)) {
17             continue;
18         }
19         if((y1==y2&&abs(y1)<eps)||(y2==y3&&abs(y2)<eps)||(y1==y3&&abs(y3)<eps)) {
20             continue;
21         }
22         double ans1=x1*y2-y1*x2;
23         double ans2=x2*y3-y2*x3;
24         double ans3=x1*y3-y1*x3;
25         if(ans1>eps&&ans2>eps&&ans3<eps){
26             ans++;
27         }
28         if(ans1<eps&&ans2<eps&&ans3>eps){
29             ans++;
30         }
31     }
32     printf("%d\n",ans);
33     return 0;
34 }

 

 

 

cogs 1656. 膜拜神犇