题目

描述

​ 难以描述。。。。。。。慢慢看。。:

​ https://loj.ac/problem/3054

范围

​ $6 \le n \le 1000  ,  1 \le |x| , |y| \le 10^9 $ , 保证 \(n\) 个点互不相同;

题解

  • 枚举 \(D\) 点,逆时针扫描 \(AD\) ,在 \(D\) 作 \(AD\) 的垂线 \(DH\) ,可以发现鱼身和鱼尾是相互独立的,可以分别求出 \(BD\) 和 \(AD\) 的对数然后相乘。

    • \(BC\) :满足条件的 \(BC\) 的中垂线是 \(AD\) 并且垂足落在\(AD\)上 ,枚举所有线段 ,求出中垂线并\(hash\) 成 \(L\) , 记录中点 \(M\) 的二元组 \((L,M)\) 并排序, 对每次统计只需要二分 $(AB,A) ,(AB,B) $ 即可。
    • \(EF\) :随着 \(AD\) 的旋转做two-pointer,每次加入都用一个 \(hash \ table\) 或者 \(map\) 维护某个长度的个数,可以动态维护\(EF\)的对数。
  • 复杂度:\(O(n^2log \ n)\)

    #include<bits/stdc++.h>
    #define ld double
    #define pb push_back
    #define ll long long
    #define eps 1e-12
    using namespace std;
    const int N=3010;
    const ld pi=acos(-1),pi1=pi/2,pi2=pi*2;
    char gc(){static char*p1,*p2,s[1000000];if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);return(p1==p2)?EOF:*p1++;
    }
    int rd(){int x=0,f=1;char c=gc();while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}while(c>='0'&&c<='9'){x=x*10+c-'0',c=gc();}return x*f;
    }
    int n,cnt;
    ll ans,now;
    map<ll,int>num;
    struct P{ll x,y;ld ang;P(ll _x=0,ll _y=0):x(_x),y(_y){ang=atan2(y,x);};P operator -(const P&A)const{return P(x-A.x,y-A.y);}P operator +(const P&A)const{return P(x+A.x,y+A.y);}
    }p[N],L[N<<1];
    bool operator <(const P&a,const P&b){return a.ang<b.ang;}
    int dcmp(ld x){return fabs(x)<eps?0:x<0?-1:1;}
    ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
    ll crs(P a,P b){return a.x*b.y-a.y*b.x;}
    ll len(P a){return a.x*a.x+a.y*a.y;}
    P rot(P a){return P(-a.y,a.x);}
    struct axis{ll a,b,c,x,y;axis(ll _a=0,ll _b=0,ll _c=0,ll _x=0,ll _y=0):a(_a),b(_b),c(_c),x(_x),y(_y){};bool operator <(const axis&A)const{if(a!=A.a)return a<A.a;if(b!=A.b)return b<A.b;if(c!=A.c)return c<A.c;if(x!=A.x)return x<A.x;return y<A.y;}bool operator ==(const axis&A)const{if(a!=A.a)return false;if(b!=A.b)return false;if(c!=A.c)return false;if(x!=A.x)return false;return y==A.y;}
    }X[N*N];
    void adj(ll&A,ll&B,ll&C){if(A<0||!A&&B<0)A=-A,B=-B,C=-C;ll g=gcd(gcd(abs(A),abs(B)),abs(C));A/=g,B/=g,C/=g;
    }
    void pre(){for(int i=1;i<=n;++i)for(int j=i+1;j<=n;++j){P v=p[j]-p[i],u=p[i]+p[j];ll A=2*v.x,B=2*v.y;ll C=v.x*u.x+v.y*u.y;adj(A,B,C);X[++cnt]=axis(A,B,C,u.x,u.y);}sort(X+1,X+cnt+1);
    }
    int cal(P a,P v){P b=a+v;ll A=v.y,B=-v.x;ll C=A*a.x+B*a.y;adj(A,B,C);axis tmpl = axis(A,B,C,a.x*2,a.y*2) , tmpr = axis(A,B,C,b.x*2,b.y*2); if(tmpr<tmpl)swap(tmpl,tmpr);if(tmpr==tmpl)return 0;int re = lower_bound(X+1,X+cnt+1,tmpr) - upper_bound(X+1,X+cnt+1,tmpl) ;return re;
    }
    void add(ll x,int y){if(~y) now+=num[x],num[x]++;else num[x]--,now-=num[x];
    }
    void solve(int a){int tot=0;for(int i=1;i<=n;++i)if(i!=a)L[++tot]=p[i]-p[a];sort(L+1,L+n);for(int i=1;i<n;++i)L[i+n-1]=L[i],L[i+n-1].ang+=pi2;now=0;num.clear();for(int i=1,l=1,r=0;i<n;++i){ld tmpl=L[i].ang+pi1,tmpr=tmpl+pi;while(r<2*n-2&&dcmp(tmpr-L[r+1].ang)>0)add(len(L[++r]),1);while(l<=2*n-2&&dcmp(L[l].ang-tmpl)<=0)add(len(L[l++]),-1);ans+=cal(p[a],L[i])*now;}
    }
    int main(){
    //    freopen("fish.in","r",stdin);
    //    freopen("fish.out","w",stdout);n=rd();for(int i=1,x,y;i<=n;++i){x=rd();y=rd();p[i]=P(x,y);}pre();for(int i=1;i<=n;++i)solve(i);cout<<ans*4<<endl;return 0;
    }

转载于:https://www.cnblogs.com/Paul-Guderian/p/10681085.html

【loj3054】【hnoi2019】鱼相关推荐

  1. [HNOI2019]鱼

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

  2. luogu P5286 [HNOI2019]鱼

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

  3. [LOJ3054] 「HNOI2019」鱼

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

  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. 知识图谱学习笔记(1)
  2. [Jarvis OJ - PWN]——[XMAN]level3
  3. ARKit文档翻译之AROrientationTrackingConfiguration类
  4. 系统架构设计师 - 构件
  5. hadoop 权限错误 Permission denied: user=root, access=WRITE, inode=/:hdfs:super
  6. 北京长途汽车站一览表
  7. vst3插件_福利:全部免费啦,JHudStudio音频效果器插件全部免费
  8. python实现txt合并
  9. paypal如何支付欧元_Paypal怎么付欧元
  10. 用tnl实现高可信赖的对象同步机制
  11. 【设计模式】观察者模式
  12. 洛谷 P2141 珠心算测验
  13. 在react怎样引入jQuery
  14. 高斯混合模型(GMM)浅入理解
  15. 生态伙伴开发实践 | 智慧检测实验室应用系统快速接入指令集数字底座
  16. 南瑞服务器cpu型号怎么查看,国电南瑞NSR612RF-DA微机综保
  17. Unity3D——添加剑痕效果(PocketRPG Trail插件)
  18. 记录2017/9/7趋势科技笔试题
  19. 凡人修真3D(3)神翼
  20. 紧急救援 (25 分)

热门文章

  1. 【分享】如何移除PDF密码?
  2. 【C++11新特性】 nullptr关键字
  3. 李国庆谈离职:记录一个降薪降职和辞职的观点
  4. 获取网络连接名称“本地连接”的两种方法
  5. 踩坑篇,多达21页的,超级详细的Oracle安装和配置教程,没有之一
  6. OA协同办公系统初始化设置
  7. Google,你让我只能高山仰止,望尘莫及了!
  8. 服务器后台设计与大型网站设计,「大型网站架构设计」—— 前言
  9. 新手如何在阿里云服务器上搭建自己的个人网站
  10. JAVA梦幻之星攻略_《梦幻之星携带版》最速流程攻略(完结)