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 坐标均不相同。
异客可以进行无限次攻击,两次攻击之间有一定时间间隔,每次攻击可以选择全图任意一名(活着的)敌人。敌人的死亡规则如第二段所示。
请输出每次修改之后,异客最少需要多少次攻击才能将地图上所有敌人全部杀死。
众所周知,人被雷劈就会死,《昨月圆车》有最真实的物理引擎,如果 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; }

浙公网安备 33010602011771号