MLE ——莫名原因 解决方法

有时候 代码提交变 mle了 思路正确但就是mle 

很难找出 哪里出问题 

 

例题:

链接:https://ac.nowcoder.com/acm/contest/29320/I
来源:牛客网

 周周的舟舟

周周在玩游戏《明日方舟》的破解版《昨月圆车》。众所周知,在《昨月圆车》中,最强的干员是异客,他能降下强大的雷霆惩罚敌人。客门。

众所周知,人被雷劈就会死,《昨月圆车》有最真实的物理引擎,如果 A 被雷劈死了,那么他周围距离 d 之内(包含d,欧几里得距离)的人例如 B 也会被劈死,然后与 B 距离 d 之内的人也会被劈死,以此类推,雷光的威严会不断传递下去……这些传递雷劈的死亡视为同时发生。

给定一张二维平面地图,地图中初始没有敌人。之后给出 qqq 次修改,每次修改给出一个坐标 (xi,yi)(x_i,y_i)(xi,yi) ,意为在地图上此坐标点处新增加一名敌人。特别的,所有敌人的 x 坐标均不相同。

异客可以进行无限次攻击,两次攻击之间有一定时间间隔,每次攻击可以选择全图任意一名(活着的)敌人。敌人的死亡规则如第二段所示。

请输出每次修改之后,异客最少需要多少次攻击才能将地图上所有敌人全部杀死。
 
思路
因为d<=100 所以一个点最多传递的也就200个点而且保证了 x 不一样 可以用并查集维护距离小于d的点 就是求有多少个连通块 
#include<bits/stdc++.h>
#define ll long long
#define FF  ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
ll x, y, d, q, ans;
//用不连续的map 可防止tle
unordered_map<ll, ll>yy, fa;

并查集路径压缩 
ll find(ll x){
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}

//合并 每次合并一次答案就减一
void merge(ll x, ll y){
    ll xx = find(x);
    ll yy = find(y);
    if(xx != yy){
                //一定是一个点的祖先变成另一个点的祖先 
                //不是让一个点的祖先变成另一个点 
        fa[xx] = yy;
        ans--;
    }
}

void solve()
{
    cin >> d >> q;
    ans = 0;
    while(q--){
                //每次答案++ 如果可以并入一个集合后续就会答案--
        ans++;
        cin >> x >> y;
        fa[x] = x;
        yy[x] = y;//储存一个点的y并且 标记这个x坐标存在
        for(int j = x - d; j <= x + d; j++){//d范围内遍历 
                        //点不存在 或者是自己要跳过 
            if(yy.find(j) == yy.end() || j == x) continue;//因为j 很大有1e9 如果用yy[j]每次都要开辟一个内存存储yy[i]就会内存超限 如果用mp.find()可以避免 
            else{
                if((j - x) * (j - x) + (yy[j] - yy[x]) * (yy[j] - yy[x]) <= d * d){
                    merge(j, x);
                }
            }
        }
        cout << ans << "\n";
      
        fflush(stdin);
    }
    
}

int main(){
    
    FF;
    int t = 1;
    while(t--){
        solve();
    }
    return 0;
}

 

posted @ 2022-03-21 19:16  Yaqu  阅读(731)  评论(0)    收藏  举报