Pentru această operație este nevoie să te autentifici.
Cod sursă (job #553282)
Utilizator |
|
IP | ascuns |
---|---|---|---|
Problemă | Înfășurătoare convexă | Compilator | cpp | 0,97 kb |
Rundă | Arhiva de probleme | Status | evaluat |
Dată | 19 apr. 2020 13:16:50 | Scor | 0 |
#include <bits/stdc++.h>
#define y first
#define x second
using namespace std;
ifstream in("infasuratoare.in");
ofstream out("infasuratoare.out");
typedef pair <long long,long long> p;
int n;
p a[1000001];
vector <p> s;
bool stanga(p a,p b,p c)
{ return (a.x-b.x)*(c.y-b.y)<(a.y-b.y)*(c.x-b.x);
}
int main()
{ in>>n;
for(int i=1;i<=n;i++)
in>>a[i].x>>a[i].y;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{ if(s.size()<2)
{ s.push_back(a[i]);
continue;
}
while(s.size()>=2 && !stanga(s[s.size()-2],s[s.size()-1],a[i]))
s.pop_back();
s.push_back(a[i]);
}
int k=s.size()-1;
for(int i=n-1;i>=1;i--)
{ if(s.size()<k+2)
{ s.push_back(a[i]);
continue;
}
while(s.size()>=k+2 && !stanga(s[s.size()-2],s[s.size()-1],a[i]))
s.pop_back();
s.push_back(a[i]);
}
s.pop_back();
out<<s.size()<<'\n';
for(auto it:s)
out<<it.x<<" "<<it.y<<'\n';
in.close();
out.close();
return 0;
}