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
AC × 2
AC × 57
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