luogu P1452 题解

Posted chifan-duck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P1452 题解相关的知识,希望对你有一定的参考价值。

管理备注:虽然此题解为乱搞,但是本乱搞是非常有意义的经典乱搞,故保留在题解区中供学习与参考。

我们充分发扬人类智慧:

将所有点全部绕原点旋转同一个角度,然后按 \\(x\\) 坐标排序。

根据数学直觉,在随机旋转后,答案中的两个点在数组中肯定不会离得太近。

所以排序后把前 \\(20000\\) 个点和后 \\(20000\\) 个点暴力枚举更新答案。

这样开 o2 就可以过了。

可以想一想这样乱搞为什么能过?

假设不旋转,出题人会使用一组 \\(x\\) 轴坐标特别远,\\(y\\) 轴坐标特别近的数据来卡你。

但是旋转后 \\(x\\) 轴坐标和 \\(y\\) 轴坐标的差会变小。

所以就可以通过数据。

此外还有其他的排序方法。

比如将 \\(x\\) 轴坐标与 \\(y\\) 轴坐标的乘积作为排序关键字。

原理都是让坐标分布更均匀。

#include<bits/stdc++.h>
#define double long double
using namespace std;
const int maxn=4e5+5;
struct node
    int x,y,lx,ly;
p[maxn];
bool cmp(node A,node B)
    if(A.x<B.x||(A.x==B.x&&A.y<B.y))
        return 1;
    else
        return 0;

int dis(node A,node B)
    return (A.lx-B.lx)*(A.lx-B.lx)+(A.ly-B.ly)*(A.ly-B.ly);

int n;
int main()
    cin>>n;
    for(int i=1;i<=n;i++)
        int X,Y;
        cin>>X>>Y;
        p[i].lx=X;
        p[i].ly=Y;
        p[i].x=X*cos(1.14)-Y*sin(1.14);
        p[i].y=X*sin(1.14)+Y*cos(1.14);
    
    sort(p+1,p+n+1,cmp);
    int ans=0;
    for(int i=1;i<=min(20000,n);i++)
        for(int j=n-min(20000,n)+1;j<=n;j++)
            ans=max(ans,dis(p[i],p[j]));
        
    
    cout<<ans<<\'\\n\';

以上是关于luogu P1452 题解的主要内容,如果未能解决你的问题,请参考以下文章

P1452 Beauty Contes(旋转卡壳版)

luogu P1514 引水入城 题解

luogu P1343 地震逃生 题解

(luogu题解搬运系列)luogu p2651 添加括号Ⅲ

luogu P2245 星际导航 题解

luogu P1186 玛丽卡 题解