牛客周赛 Round 60 连点成线(哈希+模拟)
题目链接:题目
大意:
给出若干个点(x,y),若两个点之间x或y坐标相同,则可以连线,求最长连线。
思路:
这是有限制地找最值,,与其暴力模拟时查看限制条件是否成立,不如一开始就把它们挑出来。
定义两个哈希表,一个储存所有不同x及每个相同x下对应的不同y,另一个则相反,这其中也有并查集找等价类的思想。然后分别遍历两个表,找出最大减最小。
代码:
#include <bits/stdc++.h>
using namespace std;#define int long long
#define MOD 1000000007
#define fi first
#define se second
#define pii pair<int,int>
#define vec vectorvoid solve(){int n, m;cin >> n >> m;unordered_map<int, vec<int>> mp1, mp2;for(int i = 0; i < m; i++){int x, y;cin >> x >> y;mp1[x].push_back(y);mp2[y].push_back(x);}int ans = 0;for(auto it : mp1){ans = max(ans, *max_element(it.se.begin(), it.se.end()) - *min_element(it.se.begin(), it.se.end()));}for(auto it : mp2){ans = max(ans, *max_element(it.se.begin(), it.se.end()) - *min_element(it.se.begin(), it.se.end()));}cout << ans << '\n';
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;while(t--){solve();}return 0;
} ```