Luogu5286

\(2019.4.14\),新生第一题,改了\(3\)个小时

题解-租酥雨,和出题人给的正解一模一样

枚举\(AD\),分别考虑鱼身\(BC\)和鱼尾\(EF\)
到\(E\),\(F\)距离相等的判断要避免精度问题,可以离散化其平方以后用一种莫队思想搞
关键是怎么枚举垂直,还要控制中点也在\(AD\)上

判垂直和平行的关键就是
与向量\((a,b)\)点积相同的点在一条垂直向量\((a,b)\)的直线上,与向量\((a,b)\)叉积相同的点在一条平行向量\((a,b)\)的直线上

然后加一些转化来限制鱼身的范围:
中点在\(AD\)上;
端点相对于直线\(AD\)在线段\(AD\)上(这样的取值是一个区间)
手推(逆推)就比较简单了

细节非常多,等以后学了计算几何,有时间再打一遍

\(0.\)考场上没看清题
\(1.\)有些(可能是少数)精度问题(不要先除)可以利用一些离散的方法避免;相应地,统计的方法也可以稍加变换

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){register LL x=0,f=1;register char c=getchar();while(c<48||c>57){if(c=='-')f=-1;c=getchar();}while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();return f*x;
}const int N=1005;
const double eps=1e-10;//这题坐标1e9,所以精度至少要1e-10
const double Pi=acos(-1);struct Point{LL x,y;double k;//极角inline void cal(){k=atan2(y,x);}inline bool operator< (const Point &b) const {return k<b.k;}
}p[N],q[N<<1];struct Node{LL a,b,c,d;inline bool operator< (const Node &z) const{ //这个const不能少if(a!=z.a) return a<z.a;if(b!=z.b) return b<z.b;if(c!=z.c) return c<z.c;return d<z.d;}
}S[N*N];LL len[N],tmpl[N];int cnt[N];
int n,m,Scnt,Lcnt;LL ans,sum;inline void add(int x){if(x>m) x-=m;sum+=cnt[len[x]];cnt[len[x]]++;}//这样实现非常优秀,避免了精度问题
inline void del(int x){if(x>m) x-=m;cnt[len[x]]--;sum-=cnt[len[x]];}inline LL sqr(int x){return 1ll*x*x;}int main(){n=read();for(int i=1;i<=n;i++) p[i]=(Point){read(),read()};for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){LL a=p[i].x-p[j].x,b=p[i].y-p[j].y,d=__gcd(abs(a),abs(b));a/=d,b/=d;if(a<0) a=-a,b=-b;if(a==0) b=abs(b);LL P=1ll*a*(p[i].x+p[j].x)+1ll*b*(p[i].y+p[j].y);//相应的要预处理出P和Q的值LL Q=1ll*a*p[i].y-1ll*b*p[i].x;S[++Scnt]=(Node){a,b,P,Q};}sort(S+1,S+Scnt+1);for(int i=1;i<=n;i++){m=0;for(int j=1;j<=n;j++){if(i!=j) q[++m]=(Point){p[j].x-p[i].x,p[j].y-p[i].y},q[m].cal();}sort(q+1,q+m+1);for(int j=m+1;j<=m+m;j++) q[j]=q[j-m],q[j].k+=2*Pi;//开两倍避免讨论Lcnt=0;for(int j=1;j<=m;j++) len[j]=tmpl[++Lcnt]=sqr(q[j].x)+sqr(q[j].y);sort(tmpl+1,tmpl+Lcnt+1);Lcnt=unique(tmpl+1,tmpl+Lcnt+1)-tmpl-1;for(int j=1;j<=m;j++) len[j]=lower_bound(tmpl+1,tmpl+Lcnt+1,len[j])-tmpl;//把相同长度的编号设为相同sum=0;memset(cnt,0,sizeof cnt);for(int j=1,p1=0,p2=0;j<=m;j++){//确定ADwhile(q[p1+1].k+eps<q[j].k+1.5*Pi) add(++p1);while(q[p2+1].k-eps<q[j].k+0.5*Pi) del(++p2);LL a=-q[j].y,b=q[j].x,d=__gcd(abs(a),abs(b));//枚举BC:与AD垂直a/=d,b/=d;if(a<0) a=-a,b=-b;if(a==0) b=abs(b);//这些都只是一种规定排序的方法LL P=1ll*a*(p[i].x+(p[i].x+q[j].x))+1ll*b*(p[i].y+(p[i].y+q[j].y));//中点在直线AD上LL L=1ll*a*p[i].y-1ll*b*p[i].x, R=1ll*a*(p[i].y+q[j].y)-1ll*b*(p[i].x+q[j].x);//两端点在AD范围内if(L>R) swap(L,R);ans+=sum*(lower_bound(S+1,S+Scnt+1,(Node){a,b,P,R}) - upper_bound(S+1,S+Scnt+1,(Node){a,b,P,L}));}}printf("%lld\n",ans<<2);
}

转载于:https://www.cnblogs.com/lizehon/p/10706499.html

[HNOI2019]鱼相关推荐

  1. luogu P5286 [HNOI2019]鱼

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

  2. [LOJ3054] 「HNOI2019」鱼

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

  3. 【loj3054】【hnoi2019】鱼

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

  4. scala语言运行递归“分鱼”程序

    A.B.C.D.E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉. 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份. B 第二个醒来,也将鱼分为 ...

  5. 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程...

    下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的 ...

  6. UC阿里鱼卡全网免流活动正在进行

    UC&阿里鱼卡全网免流活动正在进行 优酷.虾米.高德.书旗应用专属流量免费 赠送100分钟国内通话.1G全国流量 扫码立即免费申请

  7. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)

    [BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...

  8. 【直播】鱼佬:心跳信号分类赛高分突破

    心跳信号分类赛高分突破 目前 Datawhale第23期组队学习正在如火如荼的进行中.为了大家更好的学习,零基础入门数据挖掘(心跳信号分类) 的课程设计者王贺,将为大家带来一场直播分享--心跳信号分类 ...

  9. 上班摸鱼,刚刚发现在 VScode 中可玩魂斗罗,超级玛丽

    今天,再给大家介绍一款更加有意思的vscode插件--"小霸王". GitHub传送门:https://github.com/gamedilong/anes-repository ...

最新文章

  1. Bootstrap框架和inconfont、font-awesome使用
  2. 修改squid的Header中的X-Cache为Powered-By-LinuxTone
  3. SLAM、3D vision求职经历
  4. 结构体的嵌套 自身嵌套 相互嵌套
  5. linux基础学习(九)
  6. 允许服务与桌面交互_vivo 正式推出 Origin OS,融合自然设计与全新交互
  7. Hypermesh+Abaqus加载问题
  8. k8s高可用集群多个主节点_k8s-高可用集群实现(keepalived)
  9. HDU_2156 分数矩阵
  10. css3中的box-shadow的用法与text-shadow的用法
  11. oracle经纬度精确查询位置,基于经纬度定位车辆所在交通小区位置的方法与流程...
  12. 20.4版本Ubuntu中部署LAMP环境,部署论坛discuz
  13. 为什么要ROS2而不是对ROS1修修补补?
  14. Android自定义view绘制卡顿,Android自定义View实现绘制虚线的方法详解
  15. TMC5160步进电机驱动芯片开发手记
  16. 无法掩饰的憔悴,无法抗拒的痛紧紧相随
  17. 电子电气架构加速升级,如何实现域控制器快速部署?
  18. 轮回混音 佛教童音dj (1.0)
  19. 解决nasm/yasm not found or too old. Use --disable-x86asm for a crippled build报错
  20. 高斯分布的积分期望E(X)方差V(X)的理论推导

热门文章

  1. 不知道照片如何拼图?这3个方法能帮上你
  2. 第一学期ACM之旅总结篇
  3. 空间直角坐标转大地坐标 matlab实现
  4. 小学计算机绘图体会,辅导小学生电脑绘画的几点做法
  5. cdoj 1354 柱爷很忙
  6. linux中的码字软件,橙瓜码字神器手机版下载-橙瓜码字神器appv5.2.8-Linux公社
  7. 嵌入式编程语言挑选的原则
  8. 读iOS开发进阶有感
  9. 看了鲁迅的平面设计,很多设计师表示可能要转行了
  10. [深度学习概念]·声纹识别技术简介