Submission #1250988

#TimeUsernameProblemLanguageResultExecution timeMemory
1250988matus192timeismoney (balkan11_timeismoney)C++20
100 / 100
385 ms584 KiB
#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> oset;

#define REP(i, a, b) for (ll i = (a); i < (b); i++)
#define FOR(i, x) for (auto &i : x)
#define ff first
#define ss second
#define pb push_back
#define all(x) x.begin(), x.end()
#define IMAX INT_MAX
#define IMIN INT_MIN
#define LMAX LONG_LONG_MAX
#define LMIN LONG_LONG_MIN
#define MOD 1000000007
#define SIR 1000000009

ll n, m;
vector<pair<pll, pll>> E;
vll lnk, szs;
pair<pll, pll> ans;

ll find(ll a) {
    if (a == lnk[a]) return a;
    return lnk[a] = find(lnk[a]);
}

bool unite(ll a, ll b) {
    ll x = find(a);
    ll y = find(b);
    if (x == y) return false;
    if (szs[x] < szs[y]) swap(x, y);
    lnk[y] = x;
    szs[x] += szs[y];
    return true;
}

pll kostra(ll wa, ll wb, bool vypis = false) {
    ll res_a = 0, res_b = 0;
    lnk = vector<ll>(n);
    szs = vector<ll>(n, 1LL);
    for (ll i = 0; i < n; i++) lnk[i] = i;

    sort(all(E), [&](auto A, auto B) {
        ll r1 = wa * A.ff.ff + wb * A.ff.ss;
        ll r2 = wa * B.ff.ff + wb * B.ff.ss;
        if (r1 == r2) return A.ss < B.ss;
        return r1 < r2;
    });

    for (auto [cost, edge] : E) {
        if (unite(edge.ff, edge.ss)) {
            res_a += cost.ff;
            res_b += cost.ss;
            if (vypis == true) {
                cout << edge.ff << ' ' << edge.ss << '\n';
            }
        }
    }

    return {res_a, res_b};
}

void solve(pll a, pll b) {
    if (a == b) return;
    ll dy = llabs(a.ss - b.ss);
    ll dx = llabs(a.ff - b.ff);
    pll nw = kostra(dy, dx);
    if (nw == a || nw == b) return;
    if (nw.ff * nw.ss <
        ans.ss.ff * ans.ss.ss) {
        ans = {{dy, dx}, {nw.ff, nw.ss}};
    }
    solve(a, nw);
    solve(nw, b);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    E = vector<pair<pll, pll>>(m);  // {cena1, cena2}, {u, v}
    for (ll i = 0; i < m; i++) {
        ll a, b, x, y;
        cin >> x >> y >> a >> b;
        E[i] = {{a, b}, {x, y}};
    }

    pll p1 = kostra(1, 0), p2 = kostra(0, 1);
    if (p1.ff * p1.ss > p2.ff * p2.ss) {
        ans = {{0, 1}, {p2.ff, p2.ss}};
    } else {
        ans = {{1, 0}, {p1.ff, p1.ss}};
    }
    solve(p1, p2);

    cout << ans.ss.ff << ' ' << ans.ss.ss << '\n';

    auto [wa, wb] = ans.ff;
    kostra(wa, wb, true);

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...