10分!求救
查看原帖
10分!求救
755408
__yabnto__楼主2023/9/27 16:09
#include <algorithm>
#include <iostream>
#include <set>

using namespace std;

const int MaxN = 1e5 + 10;

set<long long> s[MaxN];
int fa[MaxN], n, m, t;
long long dis[2][MaxN], ans;

void Merge(int x, int y) {
  x = fa[x], y = fa[y];
  if (x == y) {
    return;
  }
  if (s[x].size() > s[y].size()) {
    swap(x, y);
  }
  for (int i : s[x]) {
    s[y].insert(i);
    fa[i] = y;
  }
  set<long long>().swap(s[x]);
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  for (cin >> t; t; t--) {
    cin >> n >> m, ans = 1e9;
    for (int i = 1; i <= n; i++) {
      set<long long>().swap(s[i]);
      s[i].insert(i), fa[i] = i;
    }
    for (int i = 1, u, v; i <= m; i++) {
      cin >> u >> v;
      Merge(u, v);
    }
    for (int i = 2; i <= n; i++) {
      auto tmp1 = s[fa[1]].lower_bound(i), tmp2 = s[fa[1]].upper_bound(i);
      if (tmp2 != s[fa[1]].begin()) {
        tmp2--;
      }
      dis[0][i] = min((*tmp1 - i) * (*tmp1 - i), (*tmp2 - i) * (*tmp2 - i));
    }
    for (int i = 1; i < n; i++) {
      auto tmp1 = s[fa[n]].lower_bound(i), tmp2 = s[fa[n]].upper_bound(i);
      if (tmp2 != s[fa[n]].begin()) {
        tmp2--;
      }
      dis[1][i] = min((*tmp1 - i) * (*tmp1 - i), (*tmp2 - i) * (*tmp2 - i));
    }
    dis[0][1] = dis[1][n] = 1e18;
    for (int i = 1; i <= n; i++) {
      ans = min(ans, dis[0][i] + dis[1][i]);
    }
    cout << ans << endl;
  }
  return 0;
}
2023/9/27 16:09
加载中...