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;
      }
      
  • 相关阅读:
    前端CSS-font属性,超链接的美化,css精灵,background综合属性
    iOS App上架流程(2016详细版)
    iOS中使用正则
    iOS开发--JS调用原生OC篇
    iOS开发--OC调用JS篇
    CocoaPods 的简单快速安装方法
    iOS开发小技巧 -- tableView-section圆角边框解决方案
    Mac合并分区
    iOS开发小技巧
    iOS开发中遇到的错误整理
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/10681085.html
Copyright © 2011-2022 走看看