?? 2235986_ac_170ms_440k.cc
字號:
//Graham scan algorithm
//O(nlgn)
# include <stdio.h>
# include <math.h>
# include <algorithm>
# define MAX 50001
using namespace std;
typedef int stack;
struct node
{
int x, y;
}Q[MAX];
int n, low;
int lowx, lowy;
stack p, s[MAX];
bool cmp(struct node a,struct node b)
{
if(a.x==lowx&&a.y==lowy)
return 1;
if(b.x==lowx&&b.y==lowy)
return 0;
if((a.x-lowx)*(b.y-lowy)==(b.x-lowx)*(a.y-lowy))
return (a.x-lowx)*(a.x-lowx)+(a.y-lowy)*(a.y-lowy)<(b.x-lowx)*(b.x-lowx)+(b.y-lowy)*(b.y-lowy);
return (a.x-lowx)*(b.y-lowy)-(b.x-lowx)*(a.y-lowy) > 0;
}
void GRAHAM_SCAN()
{
int i;
s[0] = 0;
i = 1;
while(i<n-1&&(Q[i].x-lowx)*(Q[i+1].y-lowy)==(Q[i+1].x-lowx)*(Q[i].y-lowy))
i++;
s[1] = i++;s[2] = i++;
p = 2;
while(i < n)
{
if(i<n-1&&(Q[i].x-lowx)*(Q[i+1].y-lowy)==(Q[i+1].x-lowx)*(Q[i].y-lowy))
{
i++;
continue;
}
while((Q[s[p-1]].x-Q[s[p]].x)*(Q[i].y-Q[s[p]].y)>=(Q[i].x-Q[s[p]].x)*(Q[s[p-1]].y-Q[s[p]].y))
p--;
s[++p] = i;
i++;
}
}
void input()
{
int i, j;
long ans = -1, tmp;
//FILE *in, *out;
//in = fopen("in.txt","r");
//out = fopen("out.txt","w");
fscanf(stdin,"%d",&n);
low = 0;
for(i = 0; i < n; i++)
{
fscanf(stdin,"%d%d",&Q[i].x,&Q[i].y);
if(i)
{
if(Q[i].y < Q[low].y||(Q[i].y == Q[low].y&&Q[i].x<Q[low].x))
low = i;
}
}
if(n<3)
{
fprintf(stdout,"%ld\n",(Q[0].x-Q[1].x)*(Q[0].x-Q[1].x)+(Q[0].y-Q[1].y)*(Q[0].y-Q[1].y));
return ;
}
lowx = Q[low].x; lowy = Q[low].y;
sort(Q,Q+n,cmp);
GRAHAM_SCAN();
for(i = 0; i < p; i++)
{
for(j = i+1; j <= p; j++)
if((tmp = (Q[s[i]].x-Q[s[j]].x)*(Q[s[i]].x-Q[s[j]].x)+(Q[s[i]].y-Q[s[j]].y)*(Q[s[i]].y-Q[s[j]].y)) > ans)
ans = tmp;
}
fprintf(stdout,"%ld\n",ans);
//fclose(in);
//fclose(out);
}
int main()
{
input();
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -