【2017多校训练2+计算几何+板】HDU 6055 Regular polygon

http://acm.hdu.edu.cn/showproblem.php?pid=6055

【题意】

给定n个格点,问有多少个正多边形

【思路】

  • 因为是格点,只可能是正方形
  • 枚举正方形的对角线,因为有两条对角线,最后答案要/2
  • 也可以枚举正方形的边,因为有四条边,答案要/4
  • 看当前对角线确定的正方形是否存在,用几何知识求出目标点的坐标,然后二分查找目标点是否存在

【Accepted】

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include<iostream>
 6 #include <vector>
 7 using namespace std ;
 8 #define eqs 1e-9
 9 struct node
10 {
11     double x , y ;
12 } p[1100] ;
13 bool cmp(node a,node b)
14 {
15     return ( a.x < b.x || ( a.x == b.x && a.y < b.y ) ) ;
16 }
17 bool judge(double x,double y,int n)
18 {
19     int low = 0 , mid , high = n-1 ;
20     while( low <= high )
21     {
22         mid = (low + high) / 2 ;
23         if( fabs(p[mid].x-x) < eqs && fabs(p[mid].y-y) < eqs )
24             return true ;
25         else if( p[mid].x-x > eqs || ( fabs(p[mid].x-x) < eqs && p[mid].y-y > eqs ) )
26             high = mid - 1 ;
27         else
28             low = mid + 1 ;
29     }
30     return false ;
31 }
32 int main()
33 {
34     int n,num;
35     double x,xx,y,yy;
36     while(scanf("%d", &n)!=EOF&&n)
37     {
38         num = 0 ;
39         for(int i = 0 ; i < n ; i++)
40         {
41             cin>>p[i].x>>p[i].y;
42         }
43         sort(p,p+n,cmp) ;
44         for(int i = 0 ; i < n ; i++)
45         {
46             for(int j = i+1 ; j < n ; j++)
47             {
48                 if( i == j ) continue ;
49                 x = (p[i].x+p[j].x)/2 ;
50                 y = (p[i].y+p[j].y)/2 ;
51                 xx = p[i].x - x ;
52                 yy = p[i].y - y ;
53                 if( judge(x+yy,y-xx,n) && judge(x-yy,y+xx,n) )
54                 {
55                     num++ ;
56                 }
57             }
58         }
59         cout<<num/2<<endl;
60     }
61     return 0;
62 }

时间: 2024-12-29 12:49:03

【2017多校训练2+计算几何+板】HDU 6055 Regular polygon的相关文章

【二分+计算几何】hdu 4033 Regular Polygon

[二分+计算几何]hdu 4033 Regular Polygon 题目链接:hdu 4033 Regular Polygon 题目大意 已知正多边形中的一个内点到所有顶点的距离,求多边形的边长. 二分问题一般都存在含有一个未知量的方程(等式关系),通过二分未知量的范围实现查找,这道题目的几何关系就是:知道一边,内角和(围着内点)等于360度.根据三角不等式确定边的二分范围,二分查找边使得内角之和为2π即可. 说一下思路 笔者根据第一条边和最后一条边确定二分边的范围,边确定由余弦定理能确定所有内

HDU 6055 - Regular polygon

/* HDU 6055 - Regular polygon [ 分析,枚举 ] 题意: 给出 x,y 都在 [-100, +100] 范围内的 N 个整点,问组成的正多边形的数目是多少 N <= 500 分析: 分析可知,整点组成的正多边形只能是正方形 故枚举两个点,验证剩下两个点的位置 坑点: 由于点的范围是 [-100, +100],故经过计算得出的点的范围可能是 [-300,+300],注意越界 编码时长:46分钟(-1) */ #include <bits/stdc++.h> u

HDU 6055 Regular polygon (暴力)

题意,二维平面上给N个整数点,问能构成多少个不同的正多边形. 析:容易得知只有正四边形可以使得所有的顶点为整数点.所以只要枚举两个点,然后去查找另外两个点就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #inclu

【链表】2017多校训练3 HDU 6058 Kanade&#39;s sum

acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k大,那么ai对答案的贡献就是ai*ni 以ai为起点,统计ai右边离ai最近的,比ai大的k个数的位置 同理统计左边的位置,组合得到答案 关键是得到比ai大的离ai最近的k个数的位置 因为是排列,所以每个数都不相等,可以记录每个数的位置,然后从小到大枚举ai,这样维护一个双向链表,保证链表中的数就是

【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线段两端点点权的乘积 现在要过原点作一条直线,要求这条直线不经过任意一个给定的点 在所有n个点两两连成的线段中,计算与这条直线有交点的线段的权值和 最大化这个权值和并输出 题目保证,给定的n个点不重合且任意两个点的连线不经过原点 [思路] 一条经过原点的直线把n个点分成两个半平面A,B 假设A中的点权

【组合数+Lucas定理】2017多校训练七 HDU 6129 Just do it

http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b 重复这样的操作m次,每次都是从上次求出的序列a得到一个新序列b 给定初始的序列,求重复m次操作后得到的序列 [思路] 假定n=5,我们模拟一次可以发现,经过m次操作后a1在b1......bn中出现的次数为: m=0: 1 0 0 0 0 m=2: 1 2 3 4 5 m=3: 1 3 6 10 1

【双向bfs】2017多校训练十 HDU 6171 Admiral

[题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最少步数,使得最终变成: 0 1 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 [思路] [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef un

2017 多校训练 1006 Function

Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 273    Accepted Submission(s): 99 Problem Description You are given a permutation a from 0 to n−1 and a permutation b from 0 to m−1. De

【2017多校训练08 1002】【HDOJ 6134】Battlestation Operational

典型的数列反演题. 运用莫比乌斯反演的一个结论 $[n = 1] = \sum_{d | n} \mu(d)$,将表达式做如下转化: $$ ans = \sum_{i=1}^n \sum_{j=1}^i (\lfloor \frac{i-1}{j} \rfloor + 1) \sum_{d | i \land d | j} \mu(d) \\ = \sum_{d=1}^n \mu(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^i (