题意:给你n个点的坐标,n<=50000,求最远点对
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const int big=50000;
int max(int a,int b) {return a>b?a:b;};
int min(int a,int b) {return a<b?a:b;};
struct node{
int x, y;
}ne[50005];
bool cmp(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int cross(node a,node b,node c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
int a[50005],m,k;
void tubao(int n)
{
sort(ne+1,ne+n+1,cmp);
m=0;
for(int i=1;i<=n;i++)
{
while(m>=2&&cross(ne[a[m-1]],ne[a[m]],ne[i])<=0)
m--;
++m;
a[m]=i;
}
k=m;
for(int i=n-1;i>=1;i--)
{
while((m>=k+1)&&cross(ne[a[m-1]],ne[a[m]],ne[i])<=0)
m--;
++m;
a[m]=i;
}
}
double dist(int i,int j)
{
return (ne[i].x-ne[j].x)*(ne[i].x-ne[j].x)
+(ne[i].y-ne[j].y)*(ne[i].y-ne[j].y);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d %d",&ne[i].x,&ne[i].y);
tubao(n);
int maxn=0;
for(int i=1;i<=k;i++)
for(int j=k+1;j<=m;j++)
maxn=max(maxn,dist(a[i],a[j]));
//for(int i=1;i<=m;i++)
// cout<<"|||"<<a[i]<<endl;
printf("%d
",maxn);
}
return 0;
}
分析:模板
wa代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <map> #include <algorithm> #include <set> using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; int max(int a,int b) {return a>b?a:b;}; int min(int a,int b) {return a<b?a:b;}; struct node{ int x, y; }ne[50005]; bool cmp(node a,node b) { if(a.x!=b.x) return a.x<b.x; return a.y<b.y; } int cross(node a,node b,node c) { return (b.x-a.x)*(c.y-b.y)-(c.x-b.x)*(b.y-a.y); } int a[50005],m; void tubao(int n) { sort(ne+1,ne+n+1,cmp); m=0; for(int i=1;i<=n;i++) { if(m>2&&cross(ne[a[m-1]],ne[a[m]],ne[i])<0) m--; a[++m]=i; } for(int i=n-1;i>=1;i--) { if(i<=(n-2)&&cross(ne[i],ne[a[m]],ne[a[m-1]])>0) m--; a[++m]=i; } } double dist(int i,int j) { return (ne[i].x-ne[j].x)*(ne[i].x-ne[j].x) +(ne[i].y-ne[j].y)*(ne[i].y-ne[j].y); } int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d %d",&ne[i].x,&ne[i].y); tubao(n); int maxn=0; for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) if(i!=j) maxn=max(maxn,dist(a[i],a[j])); //for(int i=1;i<=m;i++) // cout<<"|||"<<a[i]<<endl; printf("%d ",maxn); } return 0; }