Submission #8234140
Source Code Expand
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
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; }
};
struct UnionFind {
std::vector<int> par, num;
int gnum;
explicit UnionFind(int N) : par(N), num(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 (num[u] < num[v]) std::swap(u, v);
num[u] += num[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 num[find(v)]; }
};
using lint = long long;
int main() {
int n, m;
std::cin >> n >> m;
std::vector<Edge<lint>> edges, xedges;
for (int i = 0; i < m; ++i) {
int u, v, c;
std::cin >> u >> v >> c;
--u, --v;
if (c == 0) {
lint w;
std::cin >> w;
edges.emplace_back(u, v, w);
} else {
char w;
std::cin >> w;
xedges.emplace_back(u, v);
}
}
std::sort(edges.begin(), edges.end());
int l = edges.size();
UnionFind uf(n), xuf(n);
std::vector<lint> gnum(l + 1), cost(l + 1);
gnum[0] = n, cost[0] = 0;
// edgesのi本目まででKruskal
std::vector<lint> xgnum(l + 1), xcost(l + 1);
xgnum[0] = n, xcost[0] = 0;
// xedgesを最初に使った状態で,edgesのi本目まででKruskal
for (auto e : xedges) {
if (xuf.same(e.src, e.dst)) continue;
--xgnum[0];
xuf.unite(e.src, e.dst);
}
for (int i = 1; i <= l; ++i) {
gnum[i] = gnum[i - 1];
cost[i] = cost[i - 1];
xgnum[i] = xgnum[i - 1];
xcost[i] = xcost[i - 1];
auto e = edges[i - 1];
if (!uf.same(e.src, e.dst)) {
--gnum[i];
cost[i] += e.cost;
uf.unite(e.src, e.dst);
}
if (!xuf.same(e.src, e.dst)) {
--xgnum[i];
xcost[i] += e.cost;
xuf.unite(e.src, e.dst);
}
}
int q;
std::cin >> q;
for (int p = 0; p < q; ++p) {
lint a;
std::cin >> a;
int i = std::lower_bound(edges.begin(), edges.end(),
Edge<lint>(0, 0, a)) -
edges.begin();
// edgesをi本使った直後にxedgesが入る
lint ans = cost[i] +
(gnum[i] - xgnum[i]) * a +
(xcost[l] - xcost[i]);
// 減少した連結成分数 = xedgesから追加された辺数
std::cout << ans << std::endl;
}
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | G - MSTX |
| User | Tiramister |
| Language | C++14 (GCC 5.4.1) |
| Score | 500 |
| Code Size | 3057 Byte |
| Status | AC |
| Exec Time | 172 ms |
| Memory | 3956 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 500 / 500 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 00_sample_01, 00_sample_02 |
| All | 00_sample_01, 00_sample_02, 01_SmallRand_01, 01_SmallRand_02, 01_SmallRand_03, 01_SmallRand_04, 01_SmallRand_05, 02_MediumRand_01, 02_MediumRand_02, 02_MediumRand_03, 02_MediumRand_04, 02_MediumRand_05, 03_MaxDense_01, 03_MaxDense_02, 03_MaxDense_03, 03_MaxDense_04, 03_MaxDense_05, 03_MaxDense_06, 03_MaxDense_07, 03_MaxDense_08, 03_MaxDense_09, 03_MaxDense_10, 03_MaxDense_11, 03_MaxDense_12, 03_MaxDense_13, 03_MaxDense_14, 03_MaxDense_15, 04_LargeSparse_01, 04_LargeSparse_02, 04_LargeSparse_03, 04_LargeSparse_04, 04_LargeSparse_05, 04_LargeSparse_06, 04_LargeSparse_07, 04_LargeSparse_08, 04_LargeSparse_09, 04_LargeSparse_10, 04_LargeSparse_11, 04_LargeSparse_12, 04_LargeSparse_13, 04_LargeSparse_14, 04_LargeSparse_15, 05_MaxSparse_01, 05_MaxSparse_02, 05_MaxSparse_03, 05_MaxSparse_04, 05_MaxSparse_05, 05_MaxSparse_06, 05_MaxSparse_07, 05_MaxSparse_08, 05_MaxSparse_09, 05_MaxSparse_10, 05_MaxSparse_11, 05_MaxSparse_12, 05_MaxSparse_13, 05_MaxSparse_14, 05_MaxSparse_15 |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 00_sample_01 | AC | 1 ms | 256 KiB |
| 00_sample_02 | AC | 1 ms | 256 KiB |
| 01_SmallRand_01 | AC | 102 ms | 768 KiB |
| 01_SmallRand_02 | AC | 101 ms | 768 KiB |
| 01_SmallRand_03 | AC | 102 ms | 768 KiB |
| 01_SmallRand_04 | AC | 103 ms | 768 KiB |
| 01_SmallRand_05 | AC | 101 ms | 768 KiB |
| 02_MediumRand_01 | AC | 106 ms | 896 KiB |
| 02_MediumRand_02 | AC | 115 ms | 1152 KiB |
| 02_MediumRand_03 | AC | 119 ms | 1280 KiB |
| 02_MediumRand_04 | AC | 114 ms | 1152 KiB |
| 02_MediumRand_05 | AC | 111 ms | 1024 KiB |
| 03_MaxDense_01 | AC | 149 ms | 2548 KiB |
| 03_MaxDense_02 | AC | 157 ms | 2936 KiB |
| 03_MaxDense_03 | AC | 145 ms | 2036 KiB |
| 03_MaxDense_04 | AC | 142 ms | 1780 KiB |
| 03_MaxDense_05 | AC | 128 ms | 1524 KiB |
| 03_MaxDense_06 | AC | 160 ms | 3060 KiB |
| 03_MaxDense_07 | AC | 147 ms | 2296 KiB |
| 03_MaxDense_08 | AC | 134 ms | 1740 KiB |
| 03_MaxDense_09 | AC | 142 ms | 1780 KiB |
| 03_MaxDense_10 | AC | 132 ms | 1652 KiB |
| 03_MaxDense_11 | AC | 161 ms | 3060 KiB |
| 03_MaxDense_12 | AC | 150 ms | 2552 KiB |
| 03_MaxDense_13 | AC | 134 ms | 1740 KiB |
| 03_MaxDense_14 | AC | 142 ms | 1780 KiB |
| 03_MaxDense_15 | AC | 128 ms | 1524 KiB |
| 04_LargeSparse_01 | AC | 166 ms | 3188 KiB |
| 04_LargeSparse_02 | AC | 160 ms | 3060 KiB |
| 04_LargeSparse_03 | AC | 154 ms | 2420 KiB |
| 04_LargeSparse_04 | AC | 145 ms | 2036 KiB |
| 04_LargeSparse_05 | AC | 142 ms | 1780 KiB |
| 04_LargeSparse_06 | AC | 161 ms | 3060 KiB |
| 04_LargeSparse_07 | AC | 160 ms | 3060 KiB |
| 04_LargeSparse_08 | AC | 153 ms | 2420 KiB |
| 04_LargeSparse_09 | AC | 149 ms | 1908 KiB |
| 04_LargeSparse_10 | AC | 143 ms | 1780 KiB |
| 04_LargeSparse_11 | AC | 164 ms | 3188 KiB |
| 04_LargeSparse_12 | AC | 170 ms | 3060 KiB |
| 04_LargeSparse_13 | AC | 153 ms | 2380 KiB |
| 04_LargeSparse_14 | AC | 146 ms | 1908 KiB |
| 04_LargeSparse_15 | AC | 141 ms | 1780 KiB |
| 05_MaxSparse_01 | AC | 168 ms | 3444 KiB |
| 05_MaxSparse_02 | AC | 168 ms | 3572 KiB |
| 05_MaxSparse_03 | AC | 161 ms | 3060 KiB |
| 05_MaxSparse_04 | AC | 149 ms | 2420 KiB |
| 05_MaxSparse_05 | AC | 145 ms | 2292 KiB |
| 05_MaxSparse_06 | AC | 169 ms | 3572 KiB |
| 05_MaxSparse_07 | AC | 172 ms | 3444 KiB |
| 05_MaxSparse_08 | AC | 157 ms | 2932 KiB |
| 05_MaxSparse_09 | AC | 150 ms | 2676 KiB |
| 05_MaxSparse_10 | AC | 144 ms | 2036 KiB |
| 05_MaxSparse_11 | AC | 171 ms | 3956 KiB |
| 05_MaxSparse_12 | AC | 165 ms | 3572 KiB |
| 05_MaxSparse_13 | AC | 158 ms | 3016 KiB |
| 05_MaxSparse_14 | AC | 149 ms | 2164 KiB |
| 05_MaxSparse_15 | AC | 142 ms | 1908 KiB |