zoukankan      html  css  js  c++  java
  • 【loj3054】【hnoi2019】鱼

    题目

    描述

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

    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;
      }
      
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/10681085.html
Copyright © 2011-2022 走看看