Pagini recente » Cod sursa (job #2672704) | Cod sursa (job #2447228) | Cod sursa (job #2124862) | Cod sursa (job #2699023) | Cod sursa (job #3038215)
#include <fstream>
#include <algorithm>
#define ll long double
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;
ifstream f("rubarba.in");
ofstream g("rubarba.out");
int n,m;
const int N=1e5+5;
struct pct
{
ll x,y;
} a[N];
int conv[N];
bool cmp(pct X,pct Y)
{
if(X.x==Y.x)
return X.y<Y.y;
return X.x<Y.x;
}
int vf;
bool viz[N];
long double dy_left,dy_rgt;
int det(pct A, pct B,pct C)
{
return (B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y);
}
pct lft,rgt;
long double dx;
long distanta(pct A,pct B)
{
return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
}
long double get_dist(pct A,pct B,pct C)
{
ll a=A.y-B.y;
ll b=B.x-A.x;
ll c=A.x*(B.y-A.y)-A.y*(B.x-A.x);
long double DI=abs(a*C.x+b*C.y+c)/sqrt(a*a+b*b);
long double AB=distanta(A,B);
long double BC=distanta(B,C);
long double AC=distanta(A,C);
if(BC>AC+AB)
{
///cade in stanga
long double XA=sqrt(AC-DI*DI);
long double XB=sqrt(BC-DI*DI);
// g<<XA<<" #@!#!@"<<" "<<C.x<<" "<<C.y<<'\n';
dy_left=max(dy_left,XA);
}
else if(AC>AB+BC)
{
long double XA=sqrt(AC-DI*DI);
long double XB=sqrt(BC-DI*DI);
dy_rgt=max(dy_rgt,XB);
// g<<XB<<"dfd"<<" "<<C.x<<" "<<C.y<<'\n';
}
return DI;
}
int main()
{
f>>n;
for(int i=1; i<=n; i++)
f>>a[i].x>>a[i].y;
sort(a+1,a+n+1,cmp);
conv[++vf]=1;
conv[++vf]=2;
viz[2]=true;
for(int i=3; i<=n; i++)
{
while(vf>1&&det(a[conv[vf-1]],a[conv[vf]],a[i])<=0)
{
viz[conv[vf]]=false;
vf--;
}
conv[++vf]=i;
viz[i]=true;
}
for(int i=n-1; i>=1; i--)
{
if(viz[i]==false)
{
while(vf>1&&det(a[conv[vf-1]],a[conv[vf]],a[i])<=0)
{
viz[conv[vf]]=false;
vf--;
}
conv[++vf]=i;
viz[i]=true;
}
}
long double MIN=1e14;
for(int i=1; i<vf; i++)
{
lft=a[conv[i]];
rgt=a[conv[i+1]];
dx=0;
dy_left=0;
dy_rgt=0;
for(int j=1; j<vf; j++)
{
// g<<a[i].x<<" "<<a[i].y<<" "<<a[i+1].x<<" "<<a[i+1].y<<" ";
// g<<a[j].x<<" "<<a[j].y<<" ";
// g<<get_dist(a[i],a[i+1],a[j])<<'\n';
dx=max(dx,get_dist(a[conv[i]],a[conv[i+1]],a[conv[j]]));
}
MIN=min(MIN,dx*(dy_left+dy_rgt+sqrt(distanta(a[conv[i]],a[conv[i+1]]))));
}
g<<fixed<<setprecision(5)<<MIN;
return 0;
}