제출 #1245907

#제출 시각아이디문제언어결과실행 시간메모리
1245907kaizisntmeSirni (COCI17_sirni)C++20
112 / 140
5109 ms413436 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge
{
  int u, v, Weight;

  Edge() {}
  Edge(int u, int v, int Weight) : u(u), v(v), Weight(Weight) {}

  bool operator<(const Edge &other) const
  {
    return Weight < other.Weight;
  }
};

const int MAXN = 1e5;
const int MAXP = 1e7;

int n, nxt[MAXP + 5], Dsu_pa[MAXN + 5], cnt = 0;
vector<int> p;
Edge Ed[60000007];

void Init_Dsu()
{
  for (int i = 0; i < n; i++)
    Dsu_pa[i] = i;
}

int Find_pa(int u)
{
  if (u == Dsu_pa[u])
    return u;
  return Dsu_pa[u] = Find_pa(Dsu_pa[u]);
}

bool Dsu_Union(int u, int v)
{
  u = Find_pa(u);
  v = Find_pa(v);

  if (u == v)
    return false;

  Dsu_pa[v] = u;
  return true;
}

int main()
{
  cin.tie(0)->ios::sync_with_stdio(0);

  cin >> n;
  for (int i = 0; i < n; i++)
  {
    int x;
    cin >> x;
    p.push_back(x);
  }

  sort(p.begin(), p.end());
  p.erase(unique(p.begin(), p.end()), p.end());

  n = p.size();

  for (int i = 0; i < n - 1; i++)
  {
    nxt[p[i]] = i;
    for (int j = p[i] + 1; j < p[i + 1]; j++)
      nxt[j] = i + 1;
  }

  nxt[p[n - 1]] = n - 1;

  for (int i = 0; i < n; i++)
  {
    Ed[cnt++] = Edge(i, nxt[p[i] + 1], p[nxt[p[i] + 1]] % p[i]);
    for (int mul = 2 * p[i]; mul <= p[n - 1]; mul += p[i])
    {
      Ed[cnt++] = Edge(i, nxt[mul], p[nxt[mul]] % p[i]);
      mul = p[nxt[mul]] / p[i] * p[i];
    }
  }

  // sort(Ed.begin(), Ed.end());
  sort(Ed, Ed + cnt);

  Init_Dsu();

  int Ans = 0;
  for (auto &c : Ed)
    if (Dsu_Union(c.u, c.v))
      Ans += c.Weight;

  cout << Ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...