Pagini recente »
Istoria paginii runda/shumen_juniori_sim/clasament
|
Istoria paginii runda/concurs_9_incepatori2
|
Istoria paginii runda/tema05-juniori-2014-2015/clasament
|
Istoria paginii runda/vs_10_9dec2022/clasament
|
Cod sursă (job #77624)
Cod sursă (job
#77624)
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int VMAX = 100005;
class st {
public:
int x, y;
};
st s[VMAX], aux;
int v[VMAX];
int ccw (st a, st b, st c) {
long long cp;
cp = (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);
if (abs(cp) == 0)
return 0;
if (cp > 0)
return 1;
return -1;
}
bool cmp (st x, st y) {
if (ccw(s[0], x, y) > 0)
return true;
else
return false;
}
int main() {
int n, i, top;
freopen ("infasuratoare.in", "r", stdin);
freopen ("infasuratoare.out", "w", stdout);
scanf("%d", &n);
scanf("%d%d", &s[0].x, &s[0].y);
for (i = 1; i < n; i++) {
scanf("%d%d", &s[i].x, &s[i].y);
if ((s[i].y - s[0].y) < 0) {
aux = s[0];
s[0] = s[i];
s[i] = aux;
}
else
if (abs(s[i].y - s[i].x) == 0) {
if (s[i].x - s[0].x < 0) {
aux=s[0];
s[0]=s[i];
s[i]=aux;
}
}
}
sort(s + 1, s + n, cmp);
v[0] = 0;
v[1] = 1;
s[n] = s[0];
top = 1;
i = 2;
while(i <= n) {
if (ccw(s[v[top - 1]], s[v[top]], s[i]) > 0) {
v[++top] = i;
i++;
}
else
if (ccw(s[v[top - 1]], s[v[top]], s[i]) == 0)
{
if (i != n)
v[top] = i;
i++;
}
else {
if(i != n)
top--;
}
}
if (top == 1)
top ++;
printf("%d\n", top);
for(i = 0; i < top; i++)
printf("%d %d\n", s[v[i]].x, s[v[i]].y);
return 0;
}