标签:double ble max ret == ota def struct return
#include <bits/stdc++.h>
#define p(a,b) (Point){a,b}
#define ALL(vec) vec.begin(),vec.end()
#define pow(a) ((a)*(a))
using namespace std;
struct Point{
int x,y;
double to(Point p){
return sqrt(pow(p.x+this->x)+pow(p.y+this->y));
}
double to(int x,int y){
return sqrt(pow(x+this->x)+pow(y+this->y));
}
};
struct Vector{
int x,y;
};
int operator *(Vector a,Vector b){
return a.x*b.y+b.x*a.y;
}
int operator %(Vector a,Vector b){
return a.x*b.y-b.x*a.y;
}
Vector operator -(Point a,Point b){
return (Vector){a.x-b.x,b.x-b.y};
}
bool p_cmp(Point a,Point b){
return a.x==b.x?a.y<b.y:a.x<b.x;
}
double slope(Point a,Point b){
return (a.y-b.y)/(a.x-b.x);
}
typedef vector<Point> Point_Set;
void Graham(Point_Set &ps,Point_Set &ans){
Point s[10000];
int top=0;
ans.clear();
sort(ALL(ps),p_cmp);
s[top++]=ps[0];
s[top++]=ps[1];
for(int i=2;i<ps.size();i++){
while(top>1&&(ps[i]-s[top])*(s[top]-s[top-1])<0)top--;
s[++top]=ps[i];
}
for(int i=0;i<=top;i++)
ans.push_back(s[i]);
}
double RotatingCaliper(Point_Set &ps){
double ans=0,t1=-1,t2=0;
int i=0,j=1;
// sort(ALL(ps),p_cmp);
while(j<ps.size()){
while(t1<t2){
t1=t2;
t2=ps[i].to(ps[j++]);
}
ans=max(ans,t1);
i++;
}
return ans;
}
int main(){
int n;
Point_Set ps,ans;
cin>>n;
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
ps.push_back(p(a,b));
}
Graham(ps,ans);
cout<<RotatingCaliper(ans);
return 0;
}
标签:double ble max ret == ota def struct return
原文地址:http://www.cnblogs.com/HC-LittleJian/p/7643073.html