Submission #839574

#TimeUsernameProblemLanguageResultExecution timeMemory
839574model_codeTruck Driver (IOI23_deliveries)C++17
29 / 100
493 ms61528 KiB
// incorrect/sol_vp_fixed_guess2.cpp

#include "deliveries.h"
#include <algorithm>
#include <vector>
#include <iostream>
#include <numeric>
#include <random>
#include <queue>

using namespace std;

struct graph{
    vector<long long> dist;
    vector<int> cnt;
    long long weight_sum;
    int C;
};

vector<vector<pair<int, long long>>> g;
vector<int> ord, dist, under;
vector<bool> vis;
vector<graph> gds;

void dfs0(int x, int d){
    vis[x] = true;
    dist[x] = d;
    under[x] = 1;
    for(auto [y, w] : g[x]){
        if(!vis[y]){
            dfs0(y, d + 1);
            under[x] += under[y];
        }
    }
}

int get_c(int x, int p, int n){
    for(auto [y, w] : g[x]){
        if(y != p && under[y]*2 > n){
            return get_c(y, x, n);
        }
    }
    return x;
}

long long dfs(graph &gd, int x, long long d){
    vis[x] = true;
    gd.dist[x] = d;
    long long res = gd.cnt[x];
    for(auto [y, w] : g[x]){
        if(!vis[y]){
            long long tmp = dfs(gd, y, w + d);
            gd.weight_sum += w * tmp;
            res += tmp;
        }
    }
    return res;
}

void update(graph &gd, int x, int c){
    if(x == 0) ++c;
    gd.weight_sum += (c - gd.cnt[x]) * gd.dist[x];
    gd.cnt[x] = c;
}

void init(int N, std::vector<int> U, std::vector<int> V, std::vector<int> T, std::vector<int> W) {
	g.resize(N);
    under.resize(N);
    dist.resize(N);
    for(int i = 0; i < N-1; i++){
        g[U[i]].emplace_back(V[i], T[i]);
        g[V[i]].emplace_back(U[i], T[i]);
    }
  
    // near centroid
    vis.assign(N, false);
    dfs0(0, 0);
    int c = get_c(0, -1, N);
    vis.assign(N, false);
    dfs0(c, 0);
    // end

    const int B = min(N, 5000000/N);

    mt19937 gen(42);
    ord.resize(N);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [](int a, int b) -> bool { return dist[a] < dist[b]; });
    ord.resize(B);

    gds.resize(B);

    W[0]++;
    for(int i = 0; i < B; i++){
        vis.assign(N, false);
        gds[i].C = ord[i];
        gds[i].weight_sum = 0;
        gds[i].dist.resize(N);
        gds[i].cnt = W;
        dfs(gds[i], ord[i], 0);
    }

    return;
}

long long max_time(int S, int X) {
    long long res = 1e18;
    for(int i = 0; i < (int)gds.size(); i++){
        update(gds[i], S, X);
        res = min(res, gds[i].weight_sum);
        // cout << "i: " << i << ' ' << gds[i].weight_sum << endl;
    }
    return res * 2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...