旋转卡壳模板求助,WA#10
查看原帖
旋转卡壳模板求助,WA#10
311306
dk_qwq楼主2023/3/2 21:42
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define ll long long
#include<utility>
#define MP make_pair
#define Pos pair<ll,ll>
#define x first
#define y second
Pos operator-(const Pos &a,const Pos &b)
    {return MP(a.x-b.x,a.y-b.y);}
ll operator*(const Pos &a,const Pos &b)
    {return a.x*b.y-a.y*b.x;}
ll check(Pos a,Pos b) {return a.x*b.y-a.y*b.x;}
#define sq(x) (x)*(x)
#include<cmath>
ll dis(Pos a,Pos b) {return (sq(a.x-b.x)+sq(a.y-b.y));}
ll Area(Pos a,Pos b,Pos c){
    return abs((b-a)*(c-a));
}
const int N=5e4+5;
Pos p[N];
bool cmp(Pos a,Pos b){
    ll tmp=check(a-p[1],b-p[1]);
    if(tmp>0) return 1;
    if(tmp==0&&dis(a,p[1])<dis(b,p[1])) return 1;
    return 0;
}
int n,cnt;
#include<algorithm>
Pos stk[N];
void convex(){
    for(int i=2;i<=n;i++)
        if(p[1].y>p[i].y) swap(p[1],p[i]);
    sort(p+2,p+1+n,cmp);
    stk[++cnt]=p[1];
    for(int i=2;i<=n;i++){
        while(cnt>1&&check(stk[cnt]-stk[cnt-1],p[i]-stk[cnt])<=0)
            cnt--;
        stk[++cnt]=p[i];
    }
    stk[cnt+1]=p[1];
}
int main(){
    freopen("P1452.in","r",stdin);
    freopen("P1452.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(NULL),cout.tie(NULL);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y;
    convex();
    ll ans=0;
    int j=3;
    if(cnt==2){
        // return 1;
        cout<<dis(stk[1],stk[2])<<endl;
        return 0;
    }
    for(int i=1;i<=cnt;i++){
        ans=max(ans,dis(stk[i],stk[i+1]));
        while(Area(stk[i],stk[i+1],stk[j])<
            Area(stk[i],stk[i+1],stk[j%cnt+1])) j=j%cnt+1;
        ans=max(ans,max(dis(stk[i],stk[j]),dis(stk[i+1],stk[j])));
    }
    cout<<ans<<endl;
}
2023/3/2 21:42
加载中...