luogu P6247 [SDOI2012]最近最远点对 |随机化
Posted naruto-mzx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P6247 [SDOI2012]最近最远点对 |随机化相关的知识,希望对你有一定的参考价值。
题目描述
给定平面直角坐标系上的 (n) 个点,分别求出距离最近的两个点的距离和距离最远的两个点的距离。注意,距离为直线距离。
输入格式
第一行一个整数,(n)。 接下来 (n) 行每行两个非负浮点数,(x_i)?,(y_i),表示第 (i) 个点的 X 坐标与 Y 坐标。
输出格式
总共一行,两个浮点数,为最短距离与最长距离。误差不超过 (0.01) 视为正确。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5e5+10;
#define int long long
#define db double
inline char get_char() {
static char buf[1000001],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(double &r) {
double x=0,t=0;
int s=0,f=1;
char c=get_char();
for (; !isdigit(c); c=get_char()) {
if (c==‘-‘) f=-1;
if (c==‘.‘) goto readt;
}
for (; isdigit(c)&&c!=‘.‘; c=get_char()) x=x*10+c-‘0‘;
readt:
for (; c==‘.‘; c=get_char());
for (; isdigit(c); c=get_char()) t=t*10+c-‘0‘,++s;
r=(x+t/pow(10,s))*f;
}
inline void read(int &x) {
x=0;
char c=getchar();
for (; !isdigit(c); c=getchar());
for (; isdigit(c); c=getchar()) x=x*10+c-‘0‘;
}
int n;
struct node{
db x,y;
}e[N];
inline bool cmp(node t1,node t2){
return t1.x<t2.x;
}
inline db dis(int x,int y){
return (e[x].x-e[y].x)*(e[x].x-e[y].x)+(e[x].y-e[y].y)*(e[x].y-e[y].y);
}
db Min=1e9,Max=0;
inline void around(int p){
db x,y;
for(int i=1;i<=n;i++){
x=e[i].x, y=e[i].y;
e[i].x=x*cos(p)-y*sin(p);
e[i].y=y*cos(p)+x*sin(p);
}
sort(e+1,e+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=max(1ll,i-4);j<i;j++)
Min=min(Min,dis(i,j));
for(int i=1;i<=9;i++)
for(int j=n-9;j<=n;j++)
Max=max(Max,dis(i,j));
}
signed main(){
srand(time(0));
read(n);
for(int i=1;i<=n;i++)read(e[i].x),read(e[i].y);
around(rand());
around(rand());
printf("%.2lf %.2lf",sqrt(Min),sqrt(Max));
}
以上是关于luogu P6247 [SDOI2012]最近最远点对 |随机化的主要内容,如果未能解决你的问题,请参考以下文章
luogu P2149 [SDOI2009]Elaxia的路线 |最短路+建最短路图+卡常数
luogu2303 [SDOI2012] Longge的问题
luogu P5785 [SDOI2012]任务安排 斜率dp+二分