Submission #876771

#TimeUsernameProblemLanguageResultExecution timeMemory
876771danikoynovReconstruction Project (JOI22_reconstruction)C++14
100 / 100
1790 ms66384 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; const int maxn = 510, maxm = 1e5 + 10, maxq = 1e6 + 10; const ll inf = 1e18; struct edge { int v, u; ll w; edge(int _v = 0, int _u = 0, ll _w = 0) { v = _v; u = _u; w = _w; } bool operator < (const edge &e) const { return w < e.w; } }edges[maxm]; int n, m, q; ll ans[maxq]; struct query { int idx; ll x; bool operator < (const query &q1) const { return x < q1.x; } }task[maxq]; void input() { cin >> n >> m; for (int i = 1; i <= m; i ++) { cin >> edges[i].v >> edges[i].u >> edges[i].w; } cin >> q; for (int i = 1; i <= q; i ++) { cin >> task[i].x; task[i].idx = i; } sort(edges + 1, edges + m + 1); sort(task + 1, task + q + 1); } int par[maxn]; int find_leader(int v) { return (par[v] == v) ? v : (par[v] = find_leader(par[v])); } bool unite(int v, int u) { v = find_leader(v); u = find_leader(u); if (v == u) return false; par[v] = u; return true; } int to_left[maxm], to_right[maxm]; ll to_add[maxq], cnt_add[maxq]; void offline_mst() { for (int j = 1; j <= m; j ++) { for (int i = 1; i <= n; i ++) par[i] = i; int d = j + 1; while(d <= m) { unite(edges[d].v, edges[d].u); if (find_leader(edges[j].v) == find_leader(edges[j].u)) break; d ++; } int left = edges[j].w, right = 1e9; if (d <= m) { right = (edges[j].w + edges[d].w) / 2; if ((edges[j].w + edges[d].w) % 2 == 0) right --; } to_right[j] = right; } for (int j = 1; j <= m; j ++) { for (int i = 1; i <= n; i ++) par[i] = i; int d = j - 1; while(d > 0) { unite(edges[d].v, edges[d].u); if (find_leader(edges[j].v) == find_leader(edges[j].u)) break; d --; } int right = edges[j].w, left = 0; if (d > 0) { left = (edges[j].w + edges[d].w) / 2; if ((edges[j].w + edges[d].w) % 2 == 1) left ++; } to_left[j] = left; } for (int j = 1; j <= m; j ++) { int lf = 1, rf = q; while(lf <= rf) { int mf = (lf + rf) / 2; if (task[mf].x < to_left[j]) lf = mf + 1; else rf = mf - 1; } int lb = lf; lf = 1; rf = q; while(lf <= rf) { int mf = (lf + rf) / 2; if (task[mf].x <= to_right[j]) lf = mf + 1; else rf = mf - 1; } int rb = rf; if (lb > rb) continue; lf = 1; rf = q; while(lf <= rf) { int mf = (lf + rf) / 2; if (task[mf].x <= edges[j].w) lf = mf + 1; else rf = mf - 1; } int mb = lf - 1; to_add[lb] += edges[j].w; cnt_add[lb] ++; to_add[mb + 1] -= edges[j].w; to_add[mb + 1] -= edges[j].w; to_add[rb + 1] += edges[j].w; cnt_add[mb + 1] --; ///cout << j << " : " << to_left[j] << " " << to_right[j] << endl; //for (int i = 1; i <= q; i ++) //if (task[i].x >= to_left[j] && task[i].x <= to_right[j]) //ans[task[i].idx] += abs(task[i].x - edges[j].w); } ll und = 0, sum = 0; for (int i = 1; i <= q; i ++) { und += cnt_add[i]; sum += to_add[i]; ans[task[i].idx] = sum - und * task[i].x + (n - 1 - und) * task[i].x; } } void answer() { for (int i = 1; i <= q; i ++) cout << ans[i] << endl; } void solve() { input(); offline_mst(); answer(); } void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } int main() { speed(); solve(); return 0; }

Compilation message (stderr)

reconstruction.cpp: In function 'void offline_mst()':
reconstruction.cpp:97:13: warning: unused variable 'left' [-Wunused-variable]
   97 |         int left = edges[j].w, right = 1e9;
      |             ^~~~
reconstruction.cpp:121:13: warning: unused variable 'right' [-Wunused-variable]
  121 |         int right = edges[j].w, left = 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...