74172024-01-08 19:09:57MagyarKendeSZLGÚtadócpp17Időlimit túllépés 10/50800ms23000 KiB
#include <bits/stdc++.h>

#pragma region Utility

#define speed cin.tie(0); ios::sync_with_stdio(0)
#define cinv(v) for (auto& e : v) cin >> e;

#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define size(v) (int)v.size()
#define has(s, e) s.count(e)

#define max_index(v) max_element(all(v)) - v.begin()
#define min_index(v) min_element(all(v)) - v.begin()
#define smax(x, y) x = max(x, y)
#define smin(x, y) x = min(x, y)

#define sum(v) accumulate(all(v), 0)
#define product(v, T) accumulate(all(v), 1, multiplies<T>())

using namespace std;
using ll = long long;
using point = array<int, 2>;

int max(point p) { return max(p[0], p[1]); }
int min(point p) { return min(p[0], p[1]); }

template <typename T>
vector<T> prefix_sum(const vector<T>& v) {
    vector<T> result(size(v));
    partial_sum(all(v), result.begin());
    return result;
}

#pragma endregion

const int MOD = 32609;

int N;
vector<vector<int>> g;
vector<vector<bool>> gm;
vector<int> trafficS;
vector<bool> vis;
priority_queue<int> weightS;

int dfs(int s, int p) {
    if (s == p || vis[s]) return 0;
    vis[s] = 1;

    int result = 1;
    for (int e : g[s]) {
        result += dfs(e, p);
    }

    //cout << s << ' ';

    return result;
}

void traverse(int s) {
    //cout << "S = " << s << " | ";
    if (size(g[s]) == 0) {
        trafficS[s] = N - 1;
        //cout << trafficS[s] << '\n';
        return;
    }

    vis.assign(N + 1, 0);

    int up = dfs(1, s), down = N - up;

    trafficS[s] = up * down;
    //cout << "| " << trafficS[s] << '\n';
}

struct Edge {
public:
    int from;
    int to;
    int traffic;
    bool operator()(const Edge& a, const Edge& b) {
        return a.traffic < b.traffic;
    }
};

int parent(int s) {
    for (int i = 0; i < size(g[s]); i++) {
        if (gm[s][i]) {
            return g[s][i];
        }
    }
    return 0;
}

int main() {
    speed;

    cin >> N;

    g.resize(N + 1);
    gm.resize(N + 1);
    
    for (int i = 1; i < N; i++) {
        int U, V;
        cin >> U >> V;
        g[U].push_back(V);
        gm[U].push_back(0);

        g[V].push_back(U);
        gm[V].push_back(1);
    }

    for (int i = 1; i < N; i++) {
        int W;
        cin >> W;
        weightS.push(W);
    }

    trafficS.assign(N + 1, -1);

    for (int i = 2; i <= N; i++) {
        traverse(i);
    }


    //cout << '\n';
    //for (int x : trafficS) cout << x << ' ';
    //cout << endl;

    priority_queue<Edge, vector<Edge>, Edge> edgeS;

    for (int i = 2; i <= N; i++) {
        edgeS.push({parent(i), i, trafficS[i]});
    }

    // cout << size(edgeS) << ' ' << size(weightS) << '\n';

    int result = 0;
    vector<array<int, 3>> mappingS;

    // cout << '\n';

    while (!weightS.empty()) {
        int w = weightS.top();
        weightS.pop();
        Edge e = edgeS.top();
        edgeS.pop();

        mappingS.push_back({e.from, e.to, w});
        result += w * e.traffic;
        result %= MOD;

        // cout << e.from << ' ' << e.to << ' ' << w * e.traffic << '\n';
    }

    cout << result * 2 << '\n'; // can go both ways
    for (const auto& mapping : mappingS) {
        cout << mapping[0] << ' ' << mapping[1] << ' ' << mapping[2] << '\n';
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base10/50
1Elfogadva0/03ms1832 KiB
2Időlimit túllépés0/0800ms4456 KiB
3Részben helyes1/23ms2808 KiB
4Részben helyes1/23ms2888 KiB
5Részben helyes1/23ms3240 KiB
6Részben helyes1/23ms3456 KiB
7Részben helyes1/23ms3656 KiB
8Időlimit túllépés0/8800ms11064 KiB
9Részben helyes1/219ms5248 KiB
10Részben helyes1/220ms5148 KiB
11Részben helyes1/223ms5068 KiB
12Részben helyes1/225ms5208 KiB
13Részben helyes1/224ms5124 KiB
14Időlimit túllépés0/2776ms12112 KiB
15Időlimit túllépés0/2762ms13036 KiB
16Időlimit túllépés0/2768ms14012 KiB
17Időlimit túllépés0/2750ms15296 KiB
18Időlimit túllépés0/2760ms16356 KiB
19Időlimit túllépés0/2741ms17760 KiB
20Időlimit túllépés0/2768ms19028 KiB
21Időlimit túllépés0/2765ms19932 KiB
22Időlimit túllépés0/2768ms20940 KiB
23Időlimit túllépés0/2768ms21988 KiB
24Időlimit túllépés0/2762ms23000 KiB