제출 #715265

#제출 시각아이디문제언어결과실행 시간메모리
715265hollwo_pelwReconstruction Project (JOI22_reconstruction)C++17
100 / 100
1243 ms28472 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/trie_policy.hpp>
// #include <ext/rope>

using namespace std;
// using namespace __gnu_cxx;
// using namespace __gnu_pbds;

void Hollwo_Pelw();

signed main(){
#ifndef hollwo_pelw_local
	if (fopen(".inp", "r"))
		assert(freopen(".inp", "r", stdin)), assert(freopen(".out", "w", stdout));
#else
	using namespace chrono;
	auto start = steady_clock::now();
#endif
	cin.tie(0), cout.tie(0) -> sync_with_stdio(0);
	int testcases = 1;
	// cin >> testcases;
	for (int test = 1; test <= testcases; test++){
		// cout << "Case #" << test << ": ";
		Hollwo_Pelw();
	}
#ifdef hollwo_pelw_local
	auto end = steady_clock::now();
	cout << "\nExecution time : " << duration_cast<milliseconds> (end - start).count() << "[ms]" << endl;
#endif
}

const int N = 505, M = 1e5 + 5;

struct edge_t {
	int u, v, w;
} ed[M];

int n, m, q, par[N], pi[N], l[M], r[M];
vector<pair<int, int>> adj[N];

void Hollwo_Pelw(){
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> ed[i].u >> ed[i].v >> ed[i].w;
	}
	sort(ed + 1, ed + m + 1, [&](const edge_t &x, const edge_t &y){
		return x.w < y.w;
	});

	auto add = [&](int i) {
		// cout << "add " << ed[i].u << ' ' << ed[i].v << ' ' << ed[i].w << '\n';
		adj[ed[i].u].emplace_back(ed[i].v, i);
		adj[ed[i].v].emplace_back(ed[i].u, i);
	};
	auto rem = [&](int i) {
		// cout << "del " << ed[i].u << ' ' << ed[i].v << ' ' << ed[i].w << '\n';
		adj[ed[i].u].erase(find(adj[ed[i].u].begin(), adj[ed[i].u].end(), pair{ed[i].v, i}));
		adj[ed[i].v].erase(find(adj[ed[i].v].begin(), adj[ed[i].v].end(), pair{ed[i].u, i}));
	};
	for (int i = 1; i <= m; i++) {
		int u = ed[i].u, v = ed[i].v;
		// bfs find cycle
		queue<int> q;
		q.push(u), par[u] = pi[u] = 0;
		memset(par, -1, sizeof par);
		while (!q.empty()) {
			int u = q.front(); q.pop();
			for (auto [v, i] : adj[u]) {
				if (par[v] == -1)
					par[v] = u, pi[v] = i, q.push(v);
			}
		}
		if (par[v] != -1) {
			int j = pi[v];
			for (int s = v; s != u; s = par[s])
				j = min(j, pi[s]);
			r[j] = (ed[i].w + ed[j].w) / 2;
			l[i] = r[j] + 1, r[i] = 2e9, rem(j);
		} else {
			l[i] = 0, r[i] = 2e9;
		}
		add(i);
	}

	vector<pair<int, int>> upd;
	for (int i = 1; i <= m; i++) {
		if (l[i] <= r[i]) {
			upd.emplace_back(l[i], i), upd.emplace_back(r[i] + 1, -i);
			// cout << "ACTIVE " << l[i] << ' ' << r[i] << " -> " << i << '\n';
		}
	}
	sort(upd.begin(), upd.end());

	multiset<int> L, R;
	long long suml = 0, sumr = 0;

	cin >> q;
	for (int i = 1, j = 0, x; i <= q; i++) {
		cin >> x;
		for (; j < (int) upd.size() && upd[j].first <= x; j ++) {
			int id = upd[j].second;
			if (id < 0) {
				// cout << "REM " << id << '\n';
				id = -id;
				if (L.find(ed[id].w) != L.end()) {
					L.erase(L.find(ed[id].w)), suml -= ed[id].w;
				} else {
					R.erase(R.find(ed[id].w)), sumr -= ed[id].w;
				}
			} else {
				// cout << "ADD " << id << '\n';
				suml += ed[id].w;
				L.insert(ed[id].w);
			}
		}
		// exchange
		while (!L.empty() && *--L.end() > x) {
			int v = *--L.end();
			suml -= v, sumr += v;
			R.insert(v);
			L.erase(--L.end());
		}
		while (!R.empty() && *R.begin() <= x) {
			int v = *R.begin();
			suml += v, sumr -= v;
			L.insert(v);
			R.erase(R.begin());
		}
		// cout << "QUERY " << x << '\n';
		// cout << suml << ' ' << L.size() << '\n';
		// cout << sumr << ' ' << R.size() << '\n';
		cout << (long long) L.size() * x - suml + sumr - (long long) R.size() * x << '\n';
	}


}
#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...