叉积判断 POJ1696

 1 // 叉积判断 POJ1696
 2
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <map>
10 using namespace std;
11 #define LL long long
12 typedef pair<int,int> pii;
13 const double inf = 123456789012345.0;
14 const int MOD = 998244353;
15 const int N = 2e5+10;
16 const int maxx = 200010;
17 #define clc(a,b) memset(a,b,sizeof(a))
18 const double eps = 1e-8;
19 void fre() {freopen("in.txt","r",stdin);}
20 void freout() {freopen("out.txt","w",stdout);}
21 inline int read() {int x=0,f=1;char ch=getchar();while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1; ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();}return x*f;}
22
23 int sgn(double x){
24     if(fabs(x) < eps)return 0;
25     if(x < 0)return -1;
26     else return 1;
27 }
28
29 struct Point{
30     double x,y;
31     int index;
32     Point(){}
33     Point(double _x,double _y){
34         x = _x;y = _y;
35     }
36     Point operator -(const Point &b)const{
37         return Point(x - b.x,y - b.y);
38     }
39     double operator ^(const Point &b)const{
40         return x*b.y - y*b.x;
41     }
42     double operator *(const Point &b)const{
43         return x*b.x + y*b.y;
44     }
45 };
46
47 double dist(Point a,Point b){
48     return sqrt((a-b)*(a-b));
49 }
50
51 int pos;
52 Point p[110];
53 bool cmp(Point a,Point b){
54     double tmp=(a-p[pos])^(b-p[pos]);
55     if(sgn(tmp)==0){
56         return dist(a,p[pos])<dist(b,p[pos]);
57     }
58     else if(sgn(tmp)<0) return false;
59     else return true;
60 }
61
62 int main(){
63     int T,n;
64     scanf("%d",&T);
65     while(T--){
66         scanf("%d",&n);
67         for(int i=0;i<n;i++){
68             scanf("%d%lf%lf",&p[i].index,&p[i].x,&p[i].y);
69             if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x)){
70                 swap(p[i],p[0]);
71             }
72         }
73         pos=0;
74         for(int i=0;i<n;i++){
75             sort(p+i,p+n,cmp);
76             pos++;
77         }
78         printf("%d",n);
79         for(int i=0;i<n;i++)
80             printf(" %d",p[i].index);
81         printf("\n");
82     }
83     return 0;
84 }
时间: 2024-12-12 15:14:14

叉积判断 POJ1696的相关文章

POJ1269_Intersecting Lines(几何/叉积判断直线位置关系)

解题报告 题目传送门 题意: 判断直线的位置关系(平行,重合,相交) 思路: 两直线可以用叉积来判断位置关系. AB直线和CD直线 平行的话端点C和端点D会在直线AB的同一侧. 重合的话在直线AB上. 剩下就是相交. 求两直线交点可以用面积比和边长比来求. 看下面的图就知道了,推导就比较容易了 #include <iostream> #include <cstring> #include <cstdio> #define eps 1e-6 #define zero(x)

TOYS - POJ 2318(计算几何,叉积判断)

题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方向,然后使用二分查询找到点所在的区域. 代码如下: ============================================================================================================================ #

向量叉积判断两线段是否相交

判断两直线p1p2与q1q2是否相交,用向量叉积来判断 如果P x Q >0,则P在Q的顺时针方向: 如果P x Q <0,则P在Q的逆时针方向: 如果P x Q=0,则P与Q共线,可能同向也可能反向 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> typedef struct node {

POJ 2398 Toy Storage (叉积判断点和线段的关系)

题目链接 Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4104   Accepted: 2433 Description Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangula

POJ2318TOYS(叉积判断点与直线位置)

题目链接 题意:一个矩形被分成了n + 1块,然后给出m个点,求每个点会落在哪一块中,输出每块的点的个数 就是判断 点与直线的位置,点在直线的逆时针方向叉积 < 0,点在直线的顺时针方向叉积 > 0 1 // 可以选择二分查找 2 #include <iostream> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cstring> 6 using namespace std; 7

POJ 2318--TOYS(二分找点,叉积判断方向)

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17974   Accepted: 8539 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys away w

POJ 2398--Toy Storage(叉积判断,二分找点,点排序)

Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6534   Accepted: 3905 Description Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangular box

POJ 2318 TOYS 利用叉积判断点在线段的那一侧

题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ^ p1p0) (记得不能搞反顺序,不同的),如果他们的叉积是小于0,那么就是在线段的左边,否则右边.所以,可以用二分找,如果在mid的左边,end=mid-1 否则begin=mid+1.结束的begin,就是第一条在点右边的线段 #include <cstdio> #include <

二分+叉积判断方向 poj 2318

1 // 题意:问你每个区域有多少个点 2 // 思路:数据小可以直接暴力 3 // 也可以二分区间 4 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 #include <algorithm> 9 #include <map> 10 #include <set> 11 #include <queue> 12 #include <std