제출 #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...