【loj3054】【hnoi2019】鱼

news/2025/3/19 4:29:03/

题目

描述

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

​ 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


http://www.ppmy.cn/news/341433.html

相关文章

lopa分析_AQ/T 3054-2015保护层分析(LOPA)方法应用导则

保护层分析(LOPA)方法应用导则 1 范围 本标准规定了化工企业采用LOPA方法的技术要求,包括LOPA基本程序、场景识别与筛选、初始事件确认、独立保护层评估、场景频率技术、风险评估与决策、LOPA报告和LOPA后续跟踪及审查。 本标准适用于化工企业新建、改建、扩建和在役装置(设施…

hdu 3054 Fibonacci 找规律

传送门 题意&#xff1a;第m个满足末尾连续k个0的数是斐波那契的第几项。 思路&#xff1a;先通过打表输出找到规律&#xff0c;然后根据规律解题。运行完打表代码之后会发现1,3,4,5,6,7&#xff0c;……都是到第9个数增量是有一个变化&#xff0c;而2是到第4个数增量有了变化…

打印机故障处理【以MP 3054sp 打印机为例】

打印机故障处理【以MP 3054sp 打印机为例】 1、打印机故障原因检测 声明&#xff1a; 本文适用于打印机软件设置&#xff0c;打印机硬件问题不做判断处理。 1.1 电源故障检测 拔插打印机电源&#xff0c;检查打印机是否通电。无效的话临时借用办公室其他打印机接线做测试【…

Tektronix泰克MDO3054示波器

MDO3054混合信号示波器   简单介绍   混合域示波器拥有六种仪器&#xff0c;包括频谱分析仪、函数发生器、协议分析仪&#xff0c;电压表&#xff0c;计数器&#xff0c;数字示波器等&#xff0c;让您通过一台示波器就能捕获模拟信号、数字信号和 RF 信号。随着设计挑战不断…

bzoj3054 Rainbow的信号(位运算+瞎搞)

考虑单独统计每一位对答案的贡献。 考虑枚举区间右端点i&#xff0c;那么&操作就是往左找第一个0的位置 |操作就是往左找第一个1的位置 ^操作就是记一下到i-1的异或和为0/1的个数&#xff0c;转移一下就好了 复杂度 O(logwn) O ( l o g w n ) #include <bits/stdc.h…

pyecharts案例四——动态GDP柱状图绘制

思路 for循环每一年的数据&#xff0c;基于每一年的数据&#xff0c;创建每一年的Bar对象&#xff0c;并且将该对象添加到时间线timeline中&#xff0c;最后设置自动播放并绘图 实现代码 from pyecharts.charts import Bar, Timeline from pyecharts.options import * from …

算法模板(6):贪心

区间问题 1.区间选点 给定N个闭区间&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。输出选择的点的最小数量 将每个区间按照右端点从小到大排序。从前往后依次枚举每个区间。如果当前区间中已经包含点&#xff0c;则直接pass。否则…

中兴机架服务器5300g3,产品技术-H3C UniServer R5300 G3服务器-新华三集团-H3C

前所未有的性能 H3C UniServer R5300 G3支持8块双宽GPU或20块单宽GPU&#xff0c;提供更强的计算能力。 H3C UniServer R5300 G3针对CPU/GPU异构计算特点&#xff0c;采用PCIe4.0通信链路设计&#xff0c;可以实现GPU之间高速低延迟的数据通信&#xff0c;为用户带来卓越性能体…