面积最大的三角形一定在定点的凸包上,然后枚举顶点
注意longlong
#include <bits/stdc++.h>
using namespace std ;
#define maxn 200010
typedef long long ll ;
struct point{
ll x , y ;
};
point p[maxn] , stackn[maxn] ;
ll n , k , top , len ;
double dist(point a , point b ){
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)) ;
}
double mult(point a , point b , point c){
return (a.x - c.x)*(b.y - c.y) - (b.x - c.x)*(a.y - c.y) ;
}
bool cmp(point a , point b){
if(mult(a , b , p[0]) > 0) return true ;
if(mult(a , b , p[0]) == 0&& dist(a , p[0]) < dist(b , p[0])) return true ;
return false ;
}
void graham(){
ll i ;
top = 2 ;
sort(p + 1 , p + n , cmp) ;
for(i = 0 ; i < 3 ; i ++ ) stackn[i] = p[i] ;
for(i = 3 ; i < n ; i ++ ){
while( top > 1 && mult(p[i] , stackn[top] , stackn[top - 1]) >= 0) top -- ;
stackn[ ++ top] = p[i] ;
}
len = top + 1 ;
}
/*
8
1 5
-2 5
-1 2
4 -3
5 3
200000 -200000
200000 200000
-200000 -200000
*/
int main(){
ll i , k , j ;
double ans ;
while( ~ scanf("%lld" , &n)){
k = 0 ;
for(i = 0 ; i < n ; i ++ ){
scanf("%lld %lld" , &p[i].x , &p[i].y) ;
if(p[i].x < p[k].x || (p[i].x == p[k].x && p[i].y < p[k].y)) k = i ;
}
swap( p[0] , p[k]) ;
graham() ;
ans = 0 ;
ll ansi , ansj , ansk ;
//for(int i = 0 ; i < 10 ; i ++ ) cout << p[i].x << " " ; cout << endl ;
//for(int i = 0 ; i < 10 ; i ++ ) cout << stackn[i].x << " " ; cout << endl ;
for(i = 0 ; i <= top ; i ++ ){
for(j = i + 1 ; j <= top ; j ++ ){
for(k = j + 1 ; k <= top ; k ++ ){
if(mult(stackn[i] , stackn[j] , stackn[k]) > ans){
ans = mult(stackn[i] , stackn[j] , stackn[k]) ;
ansi = i ;
ansj = j ;
ansk = k ;
}
//ans = max(ans , mult(stackn[i] , stackn[j] , stackn[k])) ;
}
}
}
//cout << ans << endl ;
printf("%lld %lld\n%lld %lld\n%lld %lld\n" , stackn[ansi].x , stackn[ansi].y , stackn[ansj].x , stackn[ansj].y , stackn[ansk].x , stackn[ansk].y) ;
}
}