Submission #10101450
Source Code Expand
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <queue>
#include <tuple>
using lint = long long;
template <class Cost = int>
struct Edge {
int src, dst;
Cost cost;
Edge(int src = -1, int dst = -1, Cost cost = 1)
: src(src), dst(dst), cost(cost){};
bool operator<(const Edge<Cost>& e) const { return this->cost < e.cost; }
bool operator>(const Edge<Cost>& e) const { return this->cost > e.cost; }
};
template <class Cost = int>
using Edges = std::vector<Edge<Cost>>;
template <class T>
using MinHeap = std::priority_queue<T, std::vector<T>, std::greater<T>>;
struct UnionFind {
std::vector<int> par, sz;
int gnum;
explicit UnionFind(int n)
: par(n), sz(n, 1), gnum(n) {
std::iota(par.begin(), par.end(), 0);
}
int find(int v) {
return (par[v] == v) ? v : (par[v] = find(par[v]));
}
void unite(int u, int v) {
u = find(u), v = find(v);
if (u == v) return;
if (sz[u] < sz[v]) std::swap(u, v);
sz[u] += sz[v];
par[v] = u;
--gnum;
}
bool same(int u, int v) { return find(u) == find(v); }
bool ispar(int v) { return v == find(v); }
int size(int v) { return sz[find(v)]; }
};
void solve() {
int n;
lint d;
std::cin >> n >> d;
std::vector<lint> xs(n);
for (auto& x : xs) std::cin >> x;
MinHeap<Edge<lint>> heap;
std::queue<std::pair<int, int>> que;
que.emplace(0, n);
while (!que.empty()) {
int l, r;
std::tie(l, r) = que.front();
que.pop();
if (r - l <= 1) continue;
// 区間を分割
int m = (l + r) / 2;
que.emplace(l, m);
que.emplace(m, r);
// 左右で最もコストが小さい頂点を探す
int li = l;
for (int i = l + 1; i < m; ++i) {
if (xs[i] - i * d < xs[li] - li * d) li = i;
}
int ri = m;
for (int i = m + 1; i < r; ++i) {
if (xs[i] + i * d < xs[ri] + ri * d) ri = i;
}
// 辺を追加
for (int i = l; i < m; ++i) {
heap.emplace(i, ri, xs[i] + xs[ri] + (ri - i) * d);
}
for (int i = m; i < r; ++i) {
heap.emplace(li, i, xs[li] + xs[i] + (i - li) * d);
}
}
// Kruskal
lint ans = 0;
UnionFind uf(n);
while (!heap.empty()) {
auto e = heap.top();
heap.pop();
if (uf.same(e.src, e.dst)) continue;
ans += e.cost;
uf.unite(e.src, e.dst);
}
std::cout << ans << std::endl;
}
int main() {
std::cin.tie(nullptr);
std::cout.tie(nullptr);
std::ios::sync_with_stdio(false);
solve();
return 0;
}
Submission Info
Submission Time |
|
Task |
E - Connecting Cities |
User |
Tiramister |
Language |
C++14 (GCC 5.4.1) |
Score |
600 |
Code Size |
2729 Byte |
Status |
AC |
Exec Time |
1484 ms |
Memory |
69472 KiB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
600 / 600 |
Status |
|
|
Set Name |
Test Cases |
Sample |
s1.txt, s2.txt, s3.txt, s4.txt |
All |
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, s1.txt, s2.txt, s3.txt, s4.txt |
Case Name |
Status |
Exec Time |
Memory |
01.txt |
AC |
1304 ms |
68192 KiB |
02.txt |
AC |
1362 ms |
68320 KiB |
03.txt |
AC |
1446 ms |
68320 KiB |
04.txt |
AC |
1355 ms |
67808 KiB |
05.txt |
AC |
1291 ms |
68192 KiB |
06.txt |
AC |
1484 ms |
69216 KiB |
07.txt |
AC |
1354 ms |
68064 KiB |
08.txt |
AC |
1371 ms |
69088 KiB |
09.txt |
AC |
1369 ms |
68064 KiB |
10.txt |
AC |
1330 ms |
68448 KiB |
11.txt |
AC |
1087 ms |
68320 KiB |
12.txt |
AC |
1159 ms |
69472 KiB |
13.txt |
AC |
1047 ms |
67680 KiB |
14.txt |
AC |
1039 ms |
68192 KiB |
15.txt |
AC |
1171 ms |
69344 KiB |
16.txt |
AC |
1328 ms |
69088 KiB |
17.txt |
AC |
1244 ms |
68320 KiB |
18.txt |
AC |
980 ms |
67552 KiB |
19.txt |
AC |
994 ms |
68192 KiB |
20.txt |
AC |
1001 ms |
67552 KiB |
21.txt |
AC |
773 ms |
67680 KiB |
22.txt |
AC |
792 ms |
67680 KiB |
23.txt |
AC |
798 ms |
68448 KiB |
24.txt |
AC |
779 ms |
67936 KiB |
25.txt |
AC |
744 ms |
67552 KiB |
26.txt |
AC |
773 ms |
67808 KiB |
27.txt |
AC |
736 ms |
67936 KiB |
28.txt |
AC |
774 ms |
67552 KiB |
29.txt |
AC |
761 ms |
68576 KiB |
30.txt |
AC |
783 ms |
67552 KiB |
s1.txt |
AC |
1 ms |
256 KiB |
s2.txt |
AC |
1 ms |
256 KiB |
s3.txt |
AC |
1 ms |
256 KiB |
s4.txt |
AC |
1 ms |
256 KiB |