Submission #1077960

# Submission time Handle Problem Language Result Execution time Memory
1077960 2024-08-27T11:10:11 Z Sorting Factories (JOI14_factories) C++17
33 / 100
8000 ms 221248 KB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <array>
#include <iomanip>
#include <queue>
#include <stack>
#include <numeric>
#include <cassert>
#include <cmath>
#include <random>
#include <ctime>
#include <chrono>

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)x.size())
#define rep(i, a, b) for(int i = a; i < b; ++i)

template <typename T>
void remove_duplicates(vector<T> &v){
    sort(all(v));
    v.resize(unique(all(v)) - v.begin());
}

template <typename T> void chmin(T &a, T b){ a = (b < a) ? b : a; }
template <typename T> void chmax(T &a, T b){ a = (b > a) ? b : a; }

template<class T>
struct RMQ {
	vector<vector<T>> jmp;
    RMQ(){}
	RMQ(const vector<T>& V) : jmp(1, V) {
		for (int pw = 1, k = 1; pw * 2 <= sz(V); pw *= 2, ++k) {
			jmp.emplace_back(sz(V) - pw * 2 + 1);
			rep(j,0,sz(jmp[k]))
				jmp[k][j] = min(jmp[k - 1][j], jmp[k - 1][j + pw]);
		}
	}
	T query(int a, int b) {
		assert(a < b); // or return inf if a == b
		int dep = 31 - __builtin_clz(b - a);
		return min(jmp[dep][a], jmp[dep][b - (1 << dep)]);
	}
};

struct LCA {
	int T = 0;
	vi time, path, ret;
	RMQ<int> rmq;

    LCA(){}
	LCA(vector<vi>& C) : time(sz(C)), rmq((dfs(C,0,-1), ret)) {}
	void dfs(vector<vi>& C, int v, int par) {
		time[v] = T++;
		for (int y : C[v]) if (y != par) {
			path.push_back(v), ret.push_back(time[v]);
			dfs(C, y, v);
		}
	}

	int lca(int a, int b) {
		if (a == b) return a;
		tie(a, b) = minmax(time[a], time[b]);
		return path[rmq.query(a, b)];
	}
	//dist(a,b){return depth[a] + depth[b] - 2*depth[lca(a,b)];}
} lca;

const int N = 5e5 + 3;

int n, sz[N];
vector<pii> adj[N];
bool vis[N];
vi anc[N];

ll depth[N];

ll get_dist(int a, int b){
    int l = lca.lca(a, b);
    return depth[a] + depth[b] - 2 * depth[l];
}

void dfs_depth(int u, int par = -1){
    for(auto [to, w]: adj[u]){
        if(to == par) continue;
        depth[to] = depth[u] + w;
        dfs_depth(to, u);
    }
}

void dfs_sz(int u, int par = -1){
    sz[u] = 1;
    for(auto [to, w]: adj[u]){
        if(vis[to] || to == par) continue;
        dfs_sz(to, u);
        sz[u] += sz[to];
    }
}

int find_centroid(int u, int sz_root, int par = -1){
    for(auto [to, w]: adj[u]){
        if(to == par || vis[to]) continue;
        if(sz[to] >= sz_root / 2) return find_centroid(to, sz_root, u);
    }
    return u;
}

void decompose(int u, vector<int> &prevs){
    dfs_sz(u);
    int cen = find_centroid(u, sz[u]);

    prevs.push_back(cen);
    vis[cen] = true;
    anc[cen] = prevs;

    for(auto [to, w]: adj[cen]){
        if(vis[to]) continue;
        decompose(to, prevs);
    }

    prevs.pop_back();
}

void Init(int _n, int *a, int *b, int *d){
    n = _n;

    vector<vi> adj2(n + 1);
    for(int i = 0; i < n - 1; ++i){
        adj[a[i]].push_back({b[i], d[i]});
        adj[b[i]].push_back({a[i], d[i]});
        adj2[a[i]].push_back(b[i]);
        adj2[b[i]].push_back(a[i]);
    }

    lca = LCA(adj2);

    vi e{};
    decompose(0, e);

    // for(int i = 0; i < n; ++i){
        // cout << "anc of " << i << ": ";
        // for(int x: anc[i])
            // cout << x << " ";
        // cout << endl;
    // }

    dfs_depth(0);
}

const ll INF = 1e18;
ll Query(int s, int x[], int t, int y[]){
    map<ll, ll> mn;
    for(int i = 0; i < s; ++i){
        int v = x[i];
        // cout << v << " ";
        for(int a: anc[v]){
            if(!mn.count(a)) mn[a] = INF;
            chmin(mn[a], get_dist(a, v));
        }
    }
    // cout << "x" << endl;

    ll ans = INF;
    for(int i = 0; i < t; ++i){
        int v = y[i];
        // cout << v << " ";
        for(int a: anc[v]){
            if(!mn.count(a)) continue;
            chmin(ans, mn[a] + get_dist(a, v));
        }
    }
    // cout << "y" << endl;

    return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 28 ms 26968 KB Output is correct
2 Correct 1326 ms 44928 KB Output is correct
3 Correct 1781 ms 44856 KB Output is correct
4 Correct 1356 ms 44884 KB Output is correct
5 Correct 2139 ms 45140 KB Output is correct
6 Correct 433 ms 44952 KB Output is correct
7 Correct 1733 ms 45008 KB Output is correct
8 Correct 1609 ms 45028 KB Output is correct
9 Correct 2147 ms 45392 KB Output is correct
10 Correct 427 ms 44880 KB Output is correct
11 Correct 1780 ms 45012 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 26460 KB Output is correct
2 Correct 2515 ms 176248 KB Output is correct
3 Correct 3315 ms 188820 KB Output is correct
4 Correct 828 ms 166160 KB Output is correct
5 Correct 4512 ms 221248 KB Output is correct
6 Correct 3343 ms 189800 KB Output is correct
7 Correct 2904 ms 74952 KB Output is correct
8 Correct 401 ms 71656 KB Output is correct
9 Correct 3321 ms 79368 KB Output is correct
10 Correct 2790 ms 75316 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 28 ms 26968 KB Output is correct
2 Correct 1326 ms 44928 KB Output is correct
3 Correct 1781 ms 44856 KB Output is correct
4 Correct 1356 ms 44884 KB Output is correct
5 Correct 2139 ms 45140 KB Output is correct
6 Correct 433 ms 44952 KB Output is correct
7 Correct 1733 ms 45008 KB Output is correct
8 Correct 1609 ms 45028 KB Output is correct
9 Correct 2147 ms 45392 KB Output is correct
10 Correct 427 ms 44880 KB Output is correct
11 Correct 1780 ms 45012 KB Output is correct
12 Correct 13 ms 26460 KB Output is correct
13 Correct 2515 ms 176248 KB Output is correct
14 Correct 3315 ms 188820 KB Output is correct
15 Correct 828 ms 166160 KB Output is correct
16 Correct 4512 ms 221248 KB Output is correct
17 Correct 3343 ms 189800 KB Output is correct
18 Correct 2904 ms 74952 KB Output is correct
19 Correct 401 ms 71656 KB Output is correct
20 Correct 3321 ms 79368 KB Output is correct
21 Correct 2790 ms 75316 KB Output is correct
22 Execution timed out 8052 ms 184172 KB Time limit exceeded
23 Halted 0 ms 0 KB -