O(n^2)为啥会tle?并且思路感觉没问题
  • 板块P1783 海滩防御
  • 楼主syxy
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/11/19 16:37
  • 上次更新2024/11/19 18:53:34
查看原帖
O(n^2)为啥会tle?并且思路感觉没问题
1079528
syxy楼主2024/11/19 16:37
#define yyy cout<<"Yes"<<"\n" 
#define nnn cout<<"No"<<"\n" 
#define x first 
#define y second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#include<bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<ll , ll> pii;
const int N = 2e6 + 10,inf = 0x3f3f3f3f,mod = 1e9 + 7;
 
struct node
{
    int u,v;
    double w;
}edge[N];

int n,m,p[N];
pii a[N];

double dist(int x,int y,int xx,int yy)
{
    return sqrt((x - xx) * (x - xx) + (y - yy) * (y - yy));
}

int find(int x)
{
    if(p[x] != x)
    {
        p[x] = find(p[x]);
    }

    return p[x];
}

void merge(int u,int v)
{
    int fu = find(u),fv = find(v);
    if(fu != fv)
    {
        p[fu] = fv;
    }
}

bool cmp1(node a,node b)
{
    return a.w < b.w;
}

bool cmp2(pii a,pii b)
{
    return a.x < b.x;
}

bool check(double r)
{
    for(int i = 1 ; i <= m ; i++)
    {
        if(a[i].x + r >= n)
        {
            return 1;
        }
        bool f = 0;
        for(int k = m ; k >= i + 1 ; k--)
        {
            double x = dist(a[i].x , a[i].y , a[k].x , a[k].y);
            if(x <= 2 * r)
            {
                f = 1;
                i = k - 1;
                break;
            }
        }
        if(!f)
        {
            return 0;
        }
    }

    return 1;
}

int main()
{
    IOS;
    
    cin>>n>>m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin>>a[i].x>>a[i].y;
    }
    
    sort(a + 1 , a + m + 1 , cmp2);
    int cnt = 0;
    for(int i = 1 ; i <= m ; i++)
    {
        for(int j = 1 ; j <= m ; j++)
        {
            double x = dist(a[i].x , a[i].y , a[j].x , a[j].y);
            edge[++cnt] = {i , j , x};
        }
    }

    for(int i = 1 ; i <= m ; i++)
    {
        p[i] = i;
    }

    sort(edge + 1 , edge + cnt + 1 , cmp1);
    
    double maxn = max(a[1].x , n - a[m].x);
    for(int i = 1 ; i <= cnt ; i++)
    {
        int u = edge[i].u,v = edge[i].v;
        double w = edge[i].w;
        u = find(u);
        v = find(v);
        if(u != v)
        {
            merge(u , v);
            maxn = max(maxn , w * 1.0 / 2);
        }
        if(check(maxn))
        {
            break;
        }
    }

    printf("%.2lf",maxn);
}
2024/11/19 16:37
加载中...