제출 #911095

#제출 시각아이디문제언어결과실행 시간메모리
911095ParsaSReconstruction Project (JOI22_reconstruction)C++17
100 / 100
1593 ms69480 KiB
// In the name of God
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define mp make_pair
typedef long long ll;

const int N = 1e6 + 5;
int n, m, q;
vector<pair<int, pair<int, int> > > E;
int lt[N], rt[N], par[N], sz[N];
pair<int, int> qr[N];
ll ps[N], c[N], ans[N];

int get(int v) {
	return v == par[v] ? v : par[v] = get(par[v]);
}

void unite(int v, int u) {
	v = get(v), u = get(u);
	if (v == u)
		return;
	if (sz[v] > sz[u])
		swap(v, u);
	par[v] = u;
	sz[u] = sz[v] + sz[u];
}

void reset() {
	for (int i = 1; i <= n; i++)
		par[i] = i, sz[i] = 1;
}

void solve() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int v, u, w; cin >> v >> u >> w;
		E.pb(mp(w, mp(v, u)));
	}
	sort(E.begin(), E.end());
	for (int i = 0; i < m; i++) {
		reset();
		for (int j = i - 1; j >= 0; j--) {
			unite(E[j].se.fi, E[j].se.se);
			if (get(E[i].se.fi) == get(E[i].se.se)) {
				lt[i] = (E[i].fi + E[j].fi + 1) / 2;
				break;
			}
		}
		reset();
		rt[i] = 1e9 + 10;
		for (int j = i + 1; j < m; j++) {
			unite(E[j].se.fi, E[j].se.se);
			if (get(E[i].se.fi) == get(E[i].se.se)) {
				rt[i] = (E[i].fi + E[j].fi) / 2 - (E[i].fi + E[j].fi + 1) % 2;
				break;
			}
		}
		//cout << E[i].se.fi << ' ' << E[i].se.se << ' ' << E[i].fi << " : " << lt[i] << ' ' << rt[i] << endl;
	}
	cin >> q;
	for (int i = 0; i < q; i++) {
		int x; cin >> x;
		qr[i] = mp(x, i);
	}
	sort(qr, qr + q);
	
	for (int i = 0; i < m; i++) {
		int l = lower_bound(qr, qr + q, mp(lt[i], 0)) - qr;
		int r = upper_bound(qr, qr + q, mp(rt[i], (int)1e9)) - qr;
		int cur = lower_bound(qr, qr + q, mp(E[i].fi, 0)) - qr;

		int w = E[i].fi;
		ps[l] += w;
		ps[cur] -= w + w;
		ps[r] += w;

		c[cur]++;
		c[r]--;
	}
	for (int i = 0; i < q; i++) {
		if (i) {
			ps[i] += ps[i - 1];
			c[i] += c[i - 1];
		}

		int x = qr[i].fi, j = qr[i].se;
		ans[j] = 1ll * x * (2 * c[i] - (n - 1)) + ps[i];
	}
	for (int i = 0; i < q; i++)
		cout << ans[i] << '\n';
}

int32_t main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	int tc = 1; // cin >> tc;
	while (tc--) {
		solve();
	}

	return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...