Submission #273538

# Submission time Handle Problem Language Result Execution time Memory
273538 2020-08-19T05:47:01 Z shivensinha4 Factories (JOI14_factories) C++17
100 / 100
7647 ms 380672 KB
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#include "factories.h"
using namespace std; 
#define for_(i, s, e) for (int i = s; i < e; i++)
#define for__(i, s, e) for (ll i = s; i < e; i++)
#define SSTR(x) static_cast<std::ostringstream&>((std::ostringstream() << std::dec << x)).str()
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> ii;
#define endl '\n'
 
class SparseTable {
	vector<vector<ii>> st;
	vector<ll> log; vector<ii> raw;
	int n;
 
	void computeLog() {
		log.resize(n+1, -1);
		int p = 0, two_pow = 1;
		while (two_pow <= n) {
			log[two_pow] = p++;
			two_pow *= 2;
		}
		int prev = 0;
		for_(i, 1, n+1) {
			if (log[i] != -1) prev = log[i];
			else log[i] = prev;
		}
	}
 
	void buildTable() {
		int k = log[n]+1;
		st.resize(n, vector<ii> (k));
		for_(i, 0, n) st[i][0] = raw[i];
		for_(p, 1, k+1) for_(i, 0, n - (1<<p) + 1) 
			st[i][p] = min(st[i][p-1], st[i + (1 << (p-1))][p-1]);
	}
 
	public:
	void build(vector<ii> nums) {
		raw = nums;
		n = nums.size();
		computeLog();
		buildTable();
	}
 
	int mn(int l, int r) {
		int p = log[r-l+1];
		return min(st[l][p], st[r - (1<<p) + 1][p]).second;
	}
};
 
 
int n;
vector<vector<pair<int, ll>>> adjList;
vi removed, subtreeSize, centroid, tin, depth;
vector<ll> rootDist, whiteDist;
vector<ii> tour;
SparseTable st;
ll INF = 1e15;
 
int dfs(int p, int parent) {
	int s = 1;
	tin[p] = tour.size();
	tour.push_back({depth[p], p});
		
	for (auto i: adjList[p]) if (i.first != parent) {
		rootDist[i.first] = rootDist[p]+i.second;
		depth[i.first] = depth[p]+1;
		s += dfs(i.first, p);
		tour.push_back({depth[p], p});
	}
	
	subtreeSize[p] = s;
	return s;
}
 
int lca(int u, int v) {
	return st.mn(min(tin[u], tin[v]), max(tin[u], tin[v]));
}
 
ll dist(int u, int v) {
	int lc = lca(u, v);
	return rootDist[u] + rootDist[v] - 2*rootDist[lc];
}
 
void decompose(int p, int c) {
	int invalidChild = -1, sizeLimit = (subtreeSize[p] >> 1);
	for (auto i: adjList[p]) if (!removed[i.first] and subtreeSize[i.first] > sizeLimit) {
		invalidChild = i.first;
		break;
	}
	
	if (invalidChild != -1) {
		subtreeSize[p] -= subtreeSize[invalidChild];
		subtreeSize[invalidChild] += subtreeSize[p];
		return decompose(invalidChild, c);
	}
	
	removed[p] = true;
	centroid[p] = c;
	for (auto i: adjList[p]) if (!removed[i.first]) {
		centroid[i.first] = p;
		decompose(i.first, p);
	}
}

vi updated;
int pt = 0;

void update(int p) {
	int v = p;
	while (v != -1) {
		ll d = dist(p, v);
		whiteDist[v] = min(whiteDist[v], d);
		updated[pt++] = v;
		v = centroid[v];
	}
}
 
ll ans(int p) {
	ll val = INF;
	int v = p;
	while (v != -1) {
		val = min(val, whiteDist[v] + dist(p, v));
		v = centroid[v];
	}
	return (val == 1e9 ? -1 : val);
}

void Init(int N, int A[], int B[], int D[]) {
	n = N;
	adjList.resize(n); subtreeSize.resize(n); removed.resize(n); centroid.resize(n, -1); depth.resize(n); tin.resize(n); rootDist.resize(n); whiteDist.resize(n, INF); updated.resize(10*n);
	for_(i, 0, n-1) {
		int a = A[i], b = B[i]; ll w = D[i];
		adjList[a].push_back({b, w});
		adjList[b].push_back({a, w});
	}
	
	dfs(0, 0);
	decompose(0, -1);
	st.build(tour);
}

ll Query(int S, int X[], int T, int Y[]) {
	pt = 0;
	
	for_(i, 0, S) update(X[i]);
	ll val = INF;
	for_(i, 0, T) val = min(val, ans(Y[i]));
	for_(i, 0, pt) whiteDist[updated[i]] = INF;
	
	return val;
}
 
//int main() {
	//#ifndef ONLINE_JUDGE
	//freopen("test.in", "r", stdin);
	//#endif
	
	//ios_base::sync_with_stdio(false);
	//cin.tie(0);
	
	//int N, q; cin >> N >> q;
	//int A[100], B[100], D[100];
	//for_(i, 0, N-1) {
		//int a, b, w; cin >> a >> b >> w;
		//A[i] = a; B[i] = b; D[i] = w;
	//}
	
	//Init(N, A, B, D);
	
	//int X[100], Y[100];
	//while (q--) {
		//int S, T; cin >> S >> T;
		//for_(i, 0, S) cin >> X[i];
		//for_(i, 0, T) cin >> Y[i];
		//cout << Query(S, X, T, Y) << endl;
	//}
 
	//return 0;
//}
# Verdict Execution time Memory Grader output
1 Correct 13 ms 768 KB Output is correct
2 Correct 661 ms 10892 KB Output is correct
3 Correct 817 ms 11000 KB Output is correct
4 Correct 834 ms 11128 KB Output is correct
5 Correct 808 ms 11768 KB Output is correct
6 Correct 387 ms 10872 KB Output is correct
7 Correct 795 ms 11128 KB Output is correct
8 Correct 835 ms 11256 KB Output is correct
9 Correct 793 ms 11772 KB Output is correct
10 Correct 404 ms 10872 KB Output is correct
11 Correct 838 ms 11052 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 640 KB Output is correct
2 Correct 3779 ms 312964 KB Output is correct
3 Correct 4139 ms 322284 KB Output is correct
4 Correct 1889 ms 310932 KB Output is correct
5 Correct 5128 ms 380672 KB Output is correct
6 Correct 4587 ms 321936 KB Output is correct
7 Correct 3235 ms 68840 KB Output is correct
8 Correct 1096 ms 67084 KB Output is correct
9 Correct 3642 ms 75952 KB Output is correct
10 Correct 3754 ms 69328 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 768 KB Output is correct
2 Correct 661 ms 10892 KB Output is correct
3 Correct 817 ms 11000 KB Output is correct
4 Correct 834 ms 11128 KB Output is correct
5 Correct 808 ms 11768 KB Output is correct
6 Correct 387 ms 10872 KB Output is correct
7 Correct 795 ms 11128 KB Output is correct
8 Correct 835 ms 11256 KB Output is correct
9 Correct 793 ms 11772 KB Output is correct
10 Correct 404 ms 10872 KB Output is correct
11 Correct 838 ms 11052 KB Output is correct
12 Correct 2 ms 640 KB Output is correct
13 Correct 3779 ms 312964 KB Output is correct
14 Correct 4139 ms 322284 KB Output is correct
15 Correct 1889 ms 310932 KB Output is correct
16 Correct 5128 ms 380672 KB Output is correct
17 Correct 4587 ms 321936 KB Output is correct
18 Correct 3235 ms 68840 KB Output is correct
19 Correct 1096 ms 67084 KB Output is correct
20 Correct 3642 ms 75952 KB Output is correct
21 Correct 3754 ms 69328 KB Output is correct
22 Correct 5407 ms 315976 KB Output is correct
23 Correct 5470 ms 316496 KB Output is correct
24 Correct 7647 ms 323204 KB Output is correct
25 Correct 6769 ms 325732 KB Output is correct
26 Correct 6832 ms 324856 KB Output is correct
27 Correct 7486 ms 371540 KB Output is correct
28 Correct 2452 ms 316740 KB Output is correct
29 Correct 6772 ms 325872 KB Output is correct
30 Correct 6881 ms 324564 KB Output is correct
31 Correct 7343 ms 325972 KB Output is correct
32 Correct 3784 ms 91612 KB Output is correct
33 Correct 1309 ms 81464 KB Output is correct
34 Correct 2944 ms 80108 KB Output is correct
35 Correct 3176 ms 80108 KB Output is correct
36 Correct 3731 ms 81768 KB Output is correct
37 Correct 3890 ms 81800 KB Output is correct