Pagini recente »
Istoria paginii utilizator/mrlolguy1234
|
Istoria paginii utilizator/eugen1996
|
Istoria paginii utilizator/horis21
|
Cod sursă (job #285830)
|
Cod sursă (job #817367)
Cod sursă (job
#817367)
#define _USE_MATH_DEFINES
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream cin ("infasuratoare.in");
ofstream cout ("infasuratoare.out");
struct punct{
int x,y;
long double u;
bool ok;
}v[100001],s[100002],m;
bool compare (punct p,punct q)
{
return p.u<q.u;
}
int sens (punct A,punct B,punct C)
{
long long delta=(B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
return delta;
}
int main()
{
int n;
cin>>n;
m.x=1000000001;
m.y=1000000001;
int poz=1;
for (int i=1;i<=n;i++)
{
cin>>v[i].x>>v[i].y;
if (v[i].y==m.y)
{
if (v[i].x<m.x)
{
m=v[i];
poz=i;
}
}
if (v[i].y<m.y)
{
m=v[i];
poz=i;
}
}
swap(v[1],v[poz]);
for (int i=2;i<=n;i++)
{
v[i].u=atan2(v[i].y-m.y,v[i].x-m.x);
}
sort (v+2,v+n+1,compare);
/*for (int i=1;i<=n;i++)
{
cout<<v[i].x<<" "<<v[i].y<<" "<<v[i].u<<endl;
}
//cout<<atan2(-1,-1)*180.0/M_PI;*/
int t=2;
s[1]=v[1];
s[2]=v[2];
for (int i=3;i<=n;i++)
{
while (t>=2 && sens(s[t-1],s[t],v[i])<0)
{
t--;
}
t++;
s[t]=v[i];
}
int k=t;
//cout<<t<<'\n';
t++;
s[t]=s[1];
/*for (int i=2;i<t;i++)
{
if (sens (s[i-1],s[i],s[i+1])==0)
{
s[i].ok=1;
k--;
}
}*/
cout<<k<<'\n';
for (int i=1;i<t;i++)
{
if (s[i].ok==0)
cout<<s[i].x<<" "<<s[i].y<<'\n';
}
return 0;
}