Submission #759056

#TimeUsernameProblemLanguageResultExecution timeMemory
759056LoboReconstruction Project (JOI22_reconstruction)C++17
100 / 100
1160 ms852836 KiB
#include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = 550; const int maxm = 1e5+10; int n, m, q, cl[maxm], cr[maxm]; vector<int> mstl[maxm], mstr[maxm], gms[maxn]; vector<pair<int,pair<int,int>>> edges; int dfsmini(int u, int ed, int anti) { if(u == ed) return m; for(auto i : gms[u]) if(i != anti) { int v = edges[i].sc.fr+edges[i].sc.sc-u; int ret = dfsmini(v,ed,i); if(ret != -1) return min(ret,i); } return -1; } int dfsmaxi(int u, int ed, int anti) { if(u == ed) return 0; for(auto i : gms[u]) if(i != anti) { int v = edges[i].sc.fr+edges[i].sc.sc-u; int ret = dfsmaxi(v,ed,i); if(ret != -1) return max(ret,i); } return -1; } void solve() { cin >> n >> m; for(int i = 1; i <= m; i++) { int u,v,w; cin >> u >> v >> w; edges.pb(mp(w,mp(u,v))); } sort(all(edges)); for(int i = 0; i < m; i++) { if(i == 0) { mstl[i].pb(i); gms[edges[i].sc.fr].pb(i); gms[edges[i].sc.sc].pb(i); cl[i] = 0; } else { mstl[i] = mstl[i-1]; int ui = edges[i].sc.fr; int vi = edges[i].sc.sc; int j = dfsmini(ui,vi,-1); if(j == -1) { mstl[i].pb(i); gms[edges[i].sc.fr].pb(i); gms[edges[i].sc.sc].pb(i); cl[i] = 0; } else { cl[i] = (edges[i].fr+edges[j].fr+1+(2-1))/2; auto it1 = find(all(mstl[i]),j); mstl[i].erase(it1); auto it2 = find(all(gms[edges[j].sc.fr]),j); gms[edges[j].sc.fr].erase(it2); auto it3 = find(all(gms[edges[j].sc.sc]),j); gms[edges[j].sc.sc].erase(it3); mstl[i].pb(i); gms[ui].pb(i); gms[vi].pb(i); } } } for(int i = 1; i <= n; i++) { gms[i].clear(); } for(int i = m-1; i >= 0; i--) { if(i == m-1) { mstr[i].pb(i); gms[edges[i].sc.fr].pb(i); gms[edges[i].sc.sc].pb(i); cr[i] = inf; } else { mstr[i] = mstr[i+1]; int ui = edges[i].sc.fr; int vi = edges[i].sc.sc; int j = dfsmaxi(ui,vi,-1); if(j == -1) { mstr[i].pb(i); gms[edges[i].sc.fr].pb(i); gms[edges[i].sc.sc].pb(i); cr[i] = inf; } else { cr[i] = (edges[i].fr+edges[j].fr)/2; auto it1 = find(all(mstr[i]),j); mstr[i].erase(it1); auto it2 = find(all(gms[edges[j].sc.fr]),j); gms[edges[j].sc.fr].erase(it2); auto it3 = find(all(gms[edges[j].sc.sc]),j); gms[edges[j].sc.sc].erase(it3); mstr[i].pb(i); gms[ui].pb(i); gms[vi].pb(i); } } } cin >> q; vector<pair<int,pair<int,int>>> qrs; for(int i = 0; i < q; i++) { int c; cin >> c; qrs.pb(mp(c,mp(0,i))); } for(int i = 0; i < m; i++) { qrs.pb(mp(cl[i],mp(-1,i))); qrs.pb(mp(cr[i],mp(1,i))); qrs.pb(mp(edges[i].fr,mp(2,i))); } sort(all(qrs)); int ans = 0; int qp = 0; int qn = 0; for(auto X : qrs) { if(X.sc.fr == 0) { cout << ans+qp*X.fr-qn*X.fr << endl; } else if(X.sc.fr == -1) { qn++; ans+= edges[X.sc.sc].fr; } else if(X.sc.fr == 2) { qp++; qn--; ans-= 2*edges[X.sc.sc].fr; } else { qp--; ans+= edges[X.sc.sc].fr; } } } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // freopen("in.in", "r", stdin); // freopen("out.out", "w", stdout); int tt = 1; // cin >> tt; while(tt--) { solve(); } }
#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...