zoukankan      html  css  js  c++  java
  • P1429 平面最近点对[加强版] 随机化

    LINK:平面最近点对 加强版

    有一种分治的做法 因为按照x排序分治再按y排序 可以证明每次一个只会和周边的六个点进行更新。

    好像不算很难 这里给出一种随机化的做法。

    前置知识是旋转坐标系 即以某个点位旋转中心旋转某个点的位置。

    设旋转中心为(x2,y2).

    旋转公式:x=(x1-x2)cos(a)-(y1-y2)sin(a)+x2;y=(x1-x2)sin(a)+(y1-y2)cos(a)+y2;

    那么以原点为旋转中心 那其实是在旋转坐标系。

    旋转之后考虑按照x排序 那么每个点向后面几个点暴力更新答案即可。

    显然这是一个随机的过程 容易发现对于最小值得点对有极大几率可以被便利到 所以可以认为是正确.

    code
    //#include<bitsstdc++.h>
    #include<iostream>
    #include<iomanip>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<ctime>
    #include<cmath>
    #include<cctype>
    #include<cstdlib>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<vector>
    #include<algorithm>
    #include<utility>
    #include<bitset>
    #include<set>
    #include<map>
    #define ll long long
    #define db double
    #define INF 1000000000
    #define ldb long double
    #define pb push_back
    #define put_(x) printf("%d ",x);
    #define get(x) x=read()
    #define gt(x) scanf("%d",&x)
    #define gi(x) scanf("%lf",&x)
    #define put(x) printf("%d
    ",x)
    #define putl(x) printf("%lld
    ",x)
    #define gc(a) scanf("%s",a+1)
    #define rep(p,n,i) for(RE int i=p;i<=n;++i)
    #define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
    #define fep(n,p,i) for(RE int i=n;i>=p;--i)
    #define vep(p,n,i) for(RE int i=p;i<n;++i)
    #define pii pair<int,int>
    #define mk make_pair
    #define RE register
    #define P 1000000007
    #define gf(x) scanf("%lf",&x)
    #define pf(x) ((x)*(x))
    #define uint unsigned long long
    #define ui unsigned
    #define EPS 1e-8
    #define sq sqrt
    #define mod 1000000007
    #define S second
    #define F first
    #define pf(x) ((x)*(x))
    using namespace std;
    char buf[1<<15],*fs,*ft;
    inline char getc()
    {
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline int read()
    {
        RE int x=0,f=1;RE char ch=getc();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
        return x*f;
    }
    const int MAXN=200010;
    const db Pi=acos(-1.0);
    int n,m;db ans=1e10;
    struct wy{db x,y;}t[MAXN];
    inline int cmp(wy a,wy b){return a.x<b.x;}
    inline db dis(wy a,wy b){return sqrt(pf(a.x-b.x)+pf(a.y-b.y));}
    inline void around(db d)
    {
    	d=d/180*Pi;
    	rep(1,n,i)
    	{
    		db x=t[i].x,y=t[i].y;
    		t[i].x=x*cos(d)-y*sin(d);
    		t[i].y=x*sin(d)+y*cos(d);
    	}
    	sort(t+1,t+1+n,cmp);
    	rep(1,n,i)
    		for(int j=i+1;j<=i+5&&j<=n;++j)
    			ans=min(ans,dis(t[i],t[j]));
    }
    int main()
    {
    	freopen("1.in","r",stdin);
    	srand(time(0));
    	get(n);
    	rep(1,n,i){int get(x);t[i]=(wy){x,read()};}
    	around(0);around(rand()%360);printf("%.4lf",ans);
    	return 0;
    }
    
  • 相关阅读:
    啥叫ORM
    git reset --hard HEAD^ 在cmd中执行报错
    windows下生成文件目录树
    批量解决win10图标上有两个蓝色箭头的方法
    Sublime Text 3 安装包
    Sublime Text 3 部分安装过程记录
    sense8影评摘抄
    如何取消chrome的自动翻译
    把本地仓库同步到github上去
    关于PDF阅读器
  • 原文地址:https://www.cnblogs.com/chdy/p/13219424.html
Copyright © 2011-2022 走看看