看到数据范围n<=1000,但感觉用O(n^2)不现实,所以考虑方向应该是O(n^2logn)。

一种暴力做法:用vector存到1点相同的2点和到2点相同的1点,然后枚举A,枚举BC,再枚举D,然后枚举EF,O(n^4),但复杂度远远不满(符合条件的太少,而且也卡不掉),所以可以获得40pts的好成绩。

正解:

首先可以想到一点:确定A,D两点后,因为鱼身和鱼尾互不影响,可以分开计算鱼身和鱼尾,然后将二者数量相乘即可。鱼尾比较好算,直接把所有点按照极角坐标排序,然后枚举A时转移即可,复杂度O(n^2);鱼身挺难算的,因为BC中点要在AD上,且与AD垂直(即斜率相乘为-1,或一个平行一个竖直),这时候,就要预处理两两点对的中心和斜率,然后查找时二分找出范围。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=;
  5. const double pi=acos(-),eps=1e-;
  6. struct point{
  7. ll x,y;double k;
  8. void cal(){k=atan2(y,x);}
  9. bool operator<(const point&b)const{return k<b.k;}
  10. }a[N],q[N<<];
  11. struct node{
  12. ll a,b,c,d;
  13. bool operator<(const node &t)const{
  14. if(a!=t.a)return a<t.a;
  15. if(b!=t.b)return b<t.b;
  16. if(c!=t.c)return c<t.c;
  17. return d<t.d;
  18. }
  19. }s[N*N];
  20. int n,m,tot,len,num[N];
  21. ll ans,sum,dis[N],b[N];
  22. void add(int x){sum+=num[dis[(x-)%m+]],num[dis[(x-)%m+]]++;}
  23. void del(int x){num[dis[(x-)%m+]]--,sum-=num[dis[(x-)%m+]];}
  24. int main()
  25. {
  26. scanf("%d",&n);
  27. for(int i=;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].y);
  28. for(int i=;i<=n;i++)
  29. for(int j=i+;j<=n;j++)
  30. {
  31. ll x=a[i].x-a[j].x,y=a[i].y-a[j].y,d=abs(__gcd(x,y));
  32. x/=d,y/=d;
  33. if(x<)x=-x,y=-y;
  34. if(!x)y=abs(y);
  35. s[++tot]=(node){x,y,x*(a[i].x+a[j].x)+y*(a[i].y+a[j].y),x*a[i].y-y*a[i].x};
  36. }
  37. sort(s+,s+tot+);
  38. for(int i=;i<=n;i++)
  39. {
  40. m=;
  41. for(int j=;j<=n;j++)if(i!=j)q[++m]=(point){a[j].x-a[i].x,a[j].y-a[i].y},q[m].cal();
  42. sort(q+,q+m+);
  43. for(int j=m+;j<=*m;j++)q[j]=q[j-m],q[j].k+=*pi;
  44. len=;
  45. for(int j=;j<=m;j++)dis[j]=b[++len]=q[j].x*q[j].x+q[j].y*q[j].y;
  46. sort(b+,b+len+);
  47. len=unique(b+,b+len+)-b-;
  48. for(int j=;j<=m;j++)dis[j]=lower_bound(b+,b+len+,dis[j])-b;
  49. sum=;
  50. memset(num,,sizeof num);
  51. for(int j=,qs=,qe=;j<=m;j++)
  52. {
  53. while(q[qs+].k+eps<q[j].k+1.5*pi)add(++qs);
  54. while(q[qe+].k-eps<q[j].k+0.5*pi)del(++qe);
  55. ll x=-q[j].y,y=q[j].x,d=abs(__gcd(x,y));
  56. x/=d,y/=d;
  57. if(x<)x=-x,y=-y;
  58. if(!x)y=abs(y);
  59. ll t=x*(q[j].x+a[i].x+a[i].x)+y*(q[j].y+a[i].y+a[i].y);
  60. ll L=x*a[i].y-y*a[i].x,R=x*(q[j].y+a[i].y)-y*(q[j].x+a[i].x);
  61. if(L>R)swap(L,R);
  62. node xl=(node){x,y,t,L},xr=(node){x,y,t,R};
  63. ans+=sum*(lower_bound(s+,s+tot+,xr)-upper_bound(s+,s+tot+,xl));
  64. }
  65. }
  66. cout<<ans*;
  67. }

[HNOI2019]鱼(计算几何)的更多相关文章

  1. 【洛谷5286】[HNOI2019] 鱼(计算几何)

    点此看题面 大致题意: 给你\(n\)个点,让你求鱼形图的数量. 核心思路 首先,考虑到\(n\)这么小,我们可以枚举线段\(AD\),再去找符合条件的\(BC,EF\). 然后,不难发现\(BC\) ...

  2. [HNOI2019]鱼

    Luogu5286 \(2019.4.14\),新生第一题,改了\(3\)个小时 题解-租酥雨,和出题人给的正解一模一样 枚举\(AD\),分别考虑鱼身\(BC\)和鱼尾\(EF\) 到\(E\),\ ...

  3. HNOI2019 鱼 fish

    本来想写个改题记录的然后想了想改不完所以就分开写了= = https://www.luogu.org/problemnew/show/P5286 显然枚举A,D,然后鱼头和鱼身分开来考虑. 鱼身:先枚 ...

  4. luogu P5286 [HNOI2019]鱼

    传送门 这题真的牛皮,还好考场没去刚( 这题口胡起来真的简单 首先枚举D点,然后对其他所有点按极角排序,同时记录到D的距离.然后按照极角序枚举A,那么鱼尾的两个点的极角范围就是A关于D对称的那个向量, ...

  5. [LOJ3054] 「HNOI2019」鱼

    [LOJ3054] 「HNOI2019」鱼 链接 链接 题解 首先想 \(O(n^3)\) 的暴力,不难发现枚举 \(A\) 和 \(D\) 后, \((B,C)\) 和 \((E,F)\) 两组点互 ...

  6. 【loj3054】【hnoi2019】鱼

    题目 描述 ​ 难以描述.......慢慢看..: ​ https://loj.ac/problem/3054 范围 ​ $6 \le n \le 1000  ,  1 \le |x| , |y| \ ...

  7. HNOI2019 摸鱼记

    感觉准备省选时有点浮躁,没有准备联赛时那样认真, 希望能将这次省选当做一个教训吧QAQ. Day -inf 基本上把要学的东西都学了,至少做到了自己心里有底. Day 0 乒乓球室没开差评,打隔膜不带 ...

  8. [日常摸鱼]UVA393 The Doors 简单计算几何+最短路

    The  Boy Next   Doors 题意:给定一个固定大小的房间($x,y$的范围都是$[0,10]$),有$n$个墙壁作为障碍(都与横坐标轴垂直),每个墙壁都有两扇门分别用四个点来描述,起点 ...

  9. HNOI2019梦游记

    \(Day_0\) 十点半开始睡觉,开始了八个小时的不眠之夜,整晚都没睡着,这状态明天肯定挂了 \(Day_1\) 开局一条鱼,计算几何只会\(20\) 还是\(T2\)的\(20\)纯暴力好打,\( ...

随机推荐

  1. ImportError: dynamic module does not define init function (initcaffe)

    https://github.com/BVLC/caffe/issues/2770 $ python2 -c "import caffe" Traceback (most rece ...

  2. Relu激活函数的优点

    Relu优点: 1.可以使网络训练更快. 相比于sigmoid.tanh,导数更加好求,反向传播就是不断的更新参数的过程,因为其导数不复杂形式简单. 2.增加网络的非线性. 本身为非线性函数,加入到神 ...

  3. 吴裕雄--天生自然 JAVASCRIPT开发学习:输出

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. spring boot 接口返回值封装

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  5. PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]

    题目 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and ...

  6. Java版本和功能指南

    您可以使用本指南查找和安装最新的Java,了解Java发行版(AdoptOpenJdk,OpenJDK,OracleJDK等)之间的差异,以及获得Java语言功能的概述,包括Java版本8-13. J ...

  7. 合并两个word文档,保持样式不变

    一.需求说明 例如将封面插入到word正文上方 二.导入依赖 <dependency> <groupId>org.apache.poi</groupId> < ...

  8. BZOJ 4855 [Jsoi2016]轻重路径

    题解:用树链剖分来维护树链剖分 令d[x]=size[heavyson[x]]-size[lightson[x]] 当d[x]<0时轻重儿子关系改变 用数据结构维护d[x]并找到这些位置改变即可 ...

  9. 深入分析解决Deepin 15环境变量修改问题,完成JAVA环境搭建

    最近使用deepin配置JAVA环境时发现不论是修改/etc/profile还是 ~/.profile多次尝试后均无效,不得其解,最后通过官方论坛看到大神对deepin环境配置的解释,以及寻找到相关解 ...

  10. 高级变量类型(列表,元组,字典,字符串,公共方法,变量高级)for循环

    Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) 真 True 非 0 数 -- 非零即真 假 False 0 复数型 (co ...