题目链接:点击查看

题目大意:给出n个点,再给出m个询问,每次询问给出一个点 x,我们需要回答包括点 x 的直角三角形有多少个

题目分析:题目比较直接,数据也比较小,支持n*n的算法处理,首先我们必须知道,如果要包括点 x 所组成三角形,那么点 x 可以在直角点上,也可以在非直角点上,比较容易想到的方法是离线处理,我们需要分类讨论,也就是上述两个情况,对于每个询问而言,以点 x 为相对原点,对其余n个点进行极角排序,然后用双指针保证时间复杂度为O(n),一个指针固定住一条直角边,另一个指针去找另一条直角边上有多少个点,这样时间复杂度是O(n*m),解决了点 x 在直角点上的答案,剩下非直角点上的答案我们可以O(n)枚举直角点,同上利用双指针计算贡献,对于有贡献的点 x 累加答案即可,时间复杂度为大概就是n*m*logn的样子,不过实现起来比较麻烦,不想多说

还有一种方法比较简单,但是不太好想,还比较考察代码功底,就是围绕着map展开,首先我们要找直角三角形,本质上是要找垂直的两条边,换句话说就是需要找两个向量垂直,将点抽象成向量就简单多了,和上面大同小异,当点 x 为直角点时,我们记录下点 x 与 n 个点的向量,最后跑一遍map统计答案即可,当点 x 为非直角点时,一样O(n)枚举直角点,O(n)枚举另一个非直角点,然后直接统计答案就好了,实现起来比较简单,不过难点不是main函数里,而是在Point结构体内对小于号的重载,因为我们需要的是向量,也就是说需要一个带斜率的直线,为了方便起见,我们在重载小于号时应该试图将其归类,譬如(2,1)和(4,2)虽然数值不一样,但是代表的都是同一个向量,我们应该将其归为一类而不是两类,第一次知道map竟然可以根据小于号将载入的数据重新分类,有了这样一个方便的性质,在重载好小于号后就可以直接实现main函数里的内容了,比较简单,具体实现看代码

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e3+100;struct Point{LL x,y;Point(){}Point(int _x,int _y){x = _x;y = _y;}void input(){scanf("%lld%lld",&x,&y);}Point change()const//将所有的向量都转换为非负数{if(x<0||x==0&&y<0)return Point(-x,-y);return *this;}bool operator < (const Point &b)const{Point t1=change(),t2=b.change();return t1.x*t2.y<t1.y*t2.x;//利用斜率在map中分类,如果斜率相同则属于同一个向量}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}
}point[N];map<Point,int>mp;vector<Point>node;int ans[N];int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)point[i].input();for(int i=0;i<m;i++)//查询点为直角点 {mp.clear();Point temp;temp.input();node.push_back(temp);for(int i=1;i<=n;i++)mp[point[i]-temp]++;for(auto it:mp){Point temp(-it.first.y,it.first.x);ans[i]+=mp[temp]*it.second;}ans[i]/=2;//因为答案累加了两次,需要除以二}for(int i=1;i<=n;i++)//枚举n个点分别作为直角点{mp.clear();for(int j=1;j<=n;j++)//枚举另一个点 {if(i!=j)mp[point[j]-point[i]]++;}for(int j=0;j<m;j++){Point temp=node[j]-point[i];temp=Point(-temp.y,temp.x);ans[j]+=mp[temp];}} for(int i=0;i<m;i++)printf("%d\n",ans[i]);return 0;
}

Gym - 102361A Angle Beats(几何)相关推荐

  1. CCPC秦皇岛gym102361A. Angle Beats

    CCPC秦皇岛gym102361A. Angle Beats 题意: 给你n个点的坐标,现在有q次询问,每次询问给你一个坐标,问这个坐标可以与给定的n个点组成多少个不同的直角三角形 n<=200 ...

  2. Angle Beats(计算几何)

    Angle Beats(计算几何) 思路:mapmapmap排序+暴力枚举. 分两种情况:1.Q[i]1.Q[i]1.Q[i]作为直角顶点.2.Q[i]2.Q[i]2.Q[i]不作为直角顶点. 此题最 ...

  3. c语言polygon函数,C. Polygon for the Angle(几何)

    题目大意:T是测试样例,然后每一次输入一个角度,然后问你在一个n边形里面,能不能构成这个角度,如果能,输出边数,如果没有就输出-1. 具体思路:利用一个性质,四边形内的每个点都能被这个四边形内的最小的 ...

  4. 2019秦皇岛ccpc A题:Angle Beats[计算几何:统计符合直角三角形的个数]+[向量hash+3hash]

    题目链接 题目大意:就是已经知道一些点集合{p},然后q次询问每次给出一个点A,问你这个点和点集合里面多少对点可以构成三角形? 解题思路:很无奈这道题卡常了我们常规思路就是:我们分类讨论A这个点,因为 ...

  5. Gym - 102460L Largest Quadrilateral(几何-凸包+旋转卡壳求最大的四边形面积)

    题目链接:点击查看 题目大意:在笛卡尔坐标系上给出 n 个点,要求选出四个点,使得组成的四边形面积最大,求出这个最大的面积,注意此处组成的四边形不是严格意义上的四边形,只需要选四个点就行 题目分析:首 ...

  6. 牛客 数三角(求多少个钝角三角形 极角排序)

    晚上的时候PC问了一下这玩意,回忆一下极角排序 相关链接: How Many Triangles HDU - 5784(极角排序,双指针) 2019秦皇岛A - Angle Beats Gym - 1 ...

  7. 2019HDU多校补题

    心得:做不出,补不动 HUD第一场: 1001 Blank Y 1002 Operation Y 1003 Milk 1004 Vication Y 1005 Path Y 1006 Typewrit ...

  8. [300iq Contest 1]简要题解

    前言 老年选手的智商训练(1/∞) 题目链接 Angle Beats 考虑建图,发现每个∗*∗和+++的度数都为2,每个...的度数都为1 对于每个∗*∗和+++拆两个点,这两个点互相连边 对于一个∗ ...

  9. HTML5期末大作业:全屏页面滚动漫画风格个人主页网站设计 (HTML+CSS)

    HTML5期末大作业:漫画风格个人主页网站设计--html5漫画风格个人主页全屏页面滚动模板 HTML+CSS 动漫网页HTML代码 学生网页课程设计期末作业下载 动漫大学生网页设计制作成 临近期末, ...

最新文章

  1. 转: The Code Commandments: Best Practices for Objective-C Coding (updated for ARC)
  2. JavaWeb开发环境配置
  3. 廖雪峰js教程笔记9 json
  4. mysql数据剪切到新表_6、MySQL核心DDL语句
  5. Spring的IoC与DI差异
  6. 萧山职称计算机考试培训,浙江萧山2017年职称计算机考试时间安排
  7. MySQL乱码问题如何排查
  8. arduino步进电机程序库_【MM32 eMiniBoard测评报告】+驱动步进电机
  9. 【经验分享】强力推荐——截图小工具Faststone Capture(FSC)
  10. oracle里如何求及格率,统计出每个教师每门课的及格人数和及格率
  11. 《Cinema 4D + After Effects动态图形设计案例解析》——1.2 动态图形的历史和发展...
  12. 【SD2.0大会】刘振飞:微软Office研发成功三大法宝
  13. 查看linux文件工具,Linux基础命令-文本文件查看工具
  14. FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入。 带读保护版本
  15. 郑州时代科技计算机专业介绍,2021郑州的中专排名郑州时代科技中等职业学校毕业可以升大专吗...
  16. K8S系列:3种Projected Volume
  17. 跨年消费千万别忘记储备健康,乐摩吧共享按摩椅留住活力每一岁
  18. linux gbk英文转unicode,GBK编码转Unicode编码转换表
  19. 超详细的rem+vw移动端屏幕适配方案
  20. Springboot整合Mybatis多数据源配置

热门文章

  1. linux如何开启sni服务,Nginx开启单IP多SSL证书支持-TLS SNI support
  2. MySQL高级 - 常用工具 - mysqlimport与source
  3. SpringAMQP--WorkQueue模型
  4. SpringMVC的数据响应-回写数据-返回对象或集合2(应用)
  5. weblogic获取文件的路径问题
  6. 部门微服务:基本dao和service代码编写
  7. flyme禁止系统更新_魅族Flyme更新8.1.2.3A:重要系统更新!
  8. docker命令整理
  9. 常用LINQ关键字用法汇总
  10. 我犯的错误--struts标签s:radio