結果
| 問題 |
No.860 買い物
|
| コンテスト | |
| ユーザー |
けーむ
|
| 提出日時 | 2020-07-28 11:02:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 43 ms / 1,000 ms |
| コード長 | 2,508 bytes |
| コンパイル時間 | 1,741 ms |
| コンパイル使用メモリ | 176,240 KB |
| 実行使用メモリ | 9,200 KB |
| 最終ジャッジ日時 | 2024-06-28 20:36:23 |
| 合計ジャッジ時間 | 3,617 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for(ll i = 0, i##_len = (n); i < i##_len; i++)
#define reps(i, s, n) for(ll i = (s), i##_len = (n); i < i##_len; i++)
#define rrep(i, n) for(ll i = (n) - 1; i >= 0; i--)
#define rreps(i, e, n) for(ll i = (n) - 1; i >= (e); i--)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((ll)(x).size())
#define len(x) ((ll)(x).length())
#define endl "\n"
struct UnionFind {
UnionFind() {}
UnionFind(int n) {
resize(n);
}
void resize(int n) {
par.resize(n, -1);
}
int root(int x) {
if (par[x] < 0) return x;
return par[x] = root(par[x]);
}
bool merge(int x, int y) {
int rx = root(x);
int ry = root(y);
if (rx == ry) return false;
if (par[rx] > par[ry]) swap(rx, ry);
par[rx] += par[ry];
par[ry] = rx;
return true;
}
bool is_same(int x, int y) {
return (root(x) == root(y));
}
int size(int x) {
return -par[root(x)];
}
private:
vector<int> par;
};
template<class T>
struct MinimumSpanningTree {
MinimumSpanningTree() {}
MinimumSpanningTree(int n) {
vertex_count = n;
}
void resize(int n) {
vertex_count = n;
}
void add_edge(int from, int to, T cost) {
edges.emplace_back((Edge){from, to, cost});
}
T get_total_cost() {
sort(edges.begin(), edges.end(), [&](const Edge &a, const Edge &b) {
return a.cost < b.cost;
});
UnionFind uf(vertex_count);
T ans = 0;
for (int i = 0, lc = (int)edges.size(); i < lc; i++) {
if (uf.is_same(edges[i].from, edges[i].to)) continue;
uf.merge(edges[i].from, edges[i].to);
ans = ans + edges[i].cost;
}
return ans;
}
private:
struct Edge {
int from, to;
T cost;
};
int vertex_count = 0;
vector<Edge> edges;
};
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
// ifstream in("input.txt");
// cin.rdbuf(in.rdbuf());
ll n;
cin >> n;
MinimumSpanningTree<ll> mst(n + 1);
ll ans = 0;
rep(i, n) {
ll c, d;
cin >> c >> d;
if (i > 0) mst.add_edge(i, i - 1, d);
mst.add_edge(i, n, c);
ans += c;
}
ans += mst.get_total_cost();
cout << ans << endl;
return 0;
}
けーむ