#include <bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0;i<int(n);i++)
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
typedef long long ll;
typedef long double ld;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<int,int> ii;
const ld EPS=1e-6;
const ld INF=1e8;
struct pt{
ld x,y;
friend pt operator+(pt a, pt b){
return pt{a.x+b.x,a.y+b.y};
}
friend pt operator-(pt a, pt b){
return pt{a.x-b.x,a.y-b.y};
}
ld abs2(){
return x*x+y*y;
}
ld abs(){
return sqrt(abs2());
}
pt perp(){
return pt{-y,x};
}
friend ld operator*(pt a, pt b){
return a.x*b.x+a.y*b.y;
}
friend ld operator^(pt a, pt b){
return a.x*b.y-a.y*b.x;
}
friend pt operator*(ld k, pt a){
return pt{k*a.x,k*a.y};
}
};
struct line{
pt p,d;
line(){}
line(pt a, pt b){
p=a;
d=b-a;
}
bool out(pt r){
return (d^(r-p))<-EPS;
}
friend pt inter(line s, line t){
ld alpha=((t.p-s.p)^t.d)/(s.d^t.d);
return s.p+alpha*s.d;
}
};
vector<pt> hp_intersect(vector<line> &h){
deque<line> dq;
forn(i,sz(h)){
while(sz(dq)>=2&&h[i].out(inter(dq[sz(dq)-1],dq[sz(dq)-2]))) dq.pop_back();
while(sz(dq)>=2&&h[i].out(inter(dq[0],dq[1]))) dq.pop_front();
if(!empty(dq)&&fabs(h[i].d^dq.back().d)<EPS){
if(h[i].d*dq.back().d<0.0) return vector<pt>{};
if(h[i].out(dq.back().p)) dq.pop_back();
else continue;
}
dq.pb(h[i]);
}
while(sz(dq)>=3&&dq[0].out(inter(dq[sz(dq)-1],dq[sz(dq)-2]))) dq.pop_back();
while(sz(dq)>=3&&dq[sz(dq)-1].out(inter(dq[0],dq[1]))) dq.pop_front();
if(sz(dq)<3) return vector<pt>{};
vector<pt> p(sz(dq));
forn(i,sz(dq)) p[i]=inter(dq[i],dq[(i+1)%sz(dq)]);
return p;
}
ld max_dist(vector<pt> &p){
ld maxi=0.0;
int n=sz(p);
int j=1;
forn(i,n){
pt a=p[i],b=p[(i+1)%n];
while(((b-a)^(p[j]-a))<((b-a)^(p[(j+1)%n]-a))) j=(j+1)%n;
maxi=max(maxi,(a-p[j]).abs());
maxi=max(maxi,(b-p[j]).abs());
}
return maxi;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
vector<pt> p(n);
forn(i,n) cin>>p[i].x>>p[i].y;
auto check=[&](ld r){
vector<line> h(n);
forn(i,n){
pt dir=(p[(i+1)%n]-p[i]).perp();
dir=r/dir.abs()*dir;
h[i]={p[i]+dir,p[(i+1)%n]+dir};
}
vector<pt> poly=hp_intersect(h);
return max_dist(poly)>=2*r;
};
ld lo=0,hi=INF;
while(hi-lo>EPS){
ld mid=(lo+hi)/2;
if(check(mid)) lo=mid;
else hi=mid;
}
cout<<fixed<<setprecision(10)<<lo<<'\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |