题目

描述

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

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;
    }

【loj3054】【hnoi2019】鱼的更多相关文章

  1. HNOI2019 鱼 fish

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

  2. [HNOI2019]鱼

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

  3. [HNOI2019]鱼(计算几何)

    看到数据范围n<=1000,但感觉用O(n^2)不现实,所以考虑方向应该是O(n^2logn). 一种暴力做法:用vector存到1点相同的2点和到2点相同的1点,然后枚举A,枚举BC,再枚举D ...

  4. luogu P5286 [HNOI2019]鱼

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

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

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

  6. [LOJ3054] 「HNOI2019」鱼

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

  7. HNOI2019 摸鱼记

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

  8. HNOI2019梦游记

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

  9. AlloyTouch 0.2.0发布--鱼和熊掌兼得

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0 背景 公司师姐昨日在KM发了篇长文,主要结论RAF+transfo ...

随机推荐

  1. CentOS 7.2:Failed to start IPv4 firewall with iptables

    问题 系统是centos7.2,且已经安装了iptables服务,但是在执行启动命令后,却报了iptables服务无法正常启动的错误. 启动命令如下: systemctl start iptables ...

  2. Hexo博客搭建以及Next主题美化的经验之谈

    这并不是一篇博客搭建教程.内容主要包含个人对于Hexo博客搭建的心得,Next6.0主题美化的部分建议,以及摘录一些各种用于博客搭建的link. 在博客园3年6个月,确实也学到了很多,博客园也是目前为 ...

  3. 基于Nginx+Keepalived的LB服务监控(邮件报警)

    IDC两台机器上部署了Nginx+Keepalived主从模式的LB代理负载层,现在需要对LB进行每日巡检和服务监控,利用SendEmail邮件监控. 0)SendEmail部署 参考:http:// ...

  4. C. Books Queries

    链接 [http://codeforces.com/contest/1066/problem/C] 题意 开始空队列,可以进行前插和后插,还可以查询使某个数的为最左或最右需要去掉的最少数字 分析 模拟 ...

  5. 跟踪分析Linux内核的启动过程

    潘俊洋 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.准备 搭建环境 1 2 ...

  6. sqoop 使用笔记

    好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来 主要把自己的问题写出来,分享给大家 sqoop 导入数据时候 有时候会遇到mysql 中有sql 中的关键字 这时候如果直接导出 ...

  7. svn 使用教程

    一.什么是SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 二.SVN的下载安装 下载地址:http ...

  8. Practice2 结对子之“小学四则运算”

    开发环境:Eclipse,js,css,html 程序完成的方向: 1.可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号.如: 2*(-4) = ...

  9. [转帖]Lifetime Support Stages for Your Oracle Products

    Lifetime Support Stages for Your Oracle Products https://www.oracle.com/support/lifetime-support/ Pr ...

  10. [转帖]Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有

    Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有 之前用 千兆的机器 下载速度 一般只能到 50MB 左右 没法更高 万兆的话 可能也就是 200MB左右的速度 很难更高 不知道后续的服 ...