Submission #1156772

#TimeUsernameProblemLanguageResultExecution timeMemory
1156772mispertionReconstruction Project (JOI22_reconstruction)C++20
70 / 100
5093 ms18088 KiB
#include <bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using ll = long long; using ld = long double; using pii = pair<int, int>; #define F first #define S second #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() const ld PI = 3.1415926535; const ld eps = 1e-9; const int N = 2e5 + 5; const int M = 7e6 + 1; ll mod = 1e9+7; const int infi = 1e9 + 5; const ll infl = 1e16; const int P = 31; int mult(int a, int b) { return a * 1LL * b % mod; } int sum(int a, int b) { if(a + b >= mod) return a + b - mod; if(a + b < 0) return a + b + mod; return a + b; } ll binpow(ll a, ll n) { if (n == 0) return 1; if (n % 2 == 1) { return binpow(a, n - 1) * a % (mod); } else { ll b = binpow(a, n / 2); return b * b % (mod); } } int p[N], sz[N]; pair<int, pii> edg[N]; vector<pii> g[N]; pair<int, pii> vec[N]; int n, m; void clear(){ for(int i = 1; i <= n; i++) p[i] = i, sz[i] = 1; } int getp(int v){ if(v == p[v]) return v; return p[v] = getp(p[v]); } void uni(int a, int b){ a = getp(a); b = getp(b); if(a == b) return; if(sz[a] > sz[b]) swap(a, b); p[a] = b; sz[b] += sz[a]; } pair<int, pii> dfs(int v, int nd, int p, int w){ if(v == nd){ return {w, {p, v}}; } int mx = -infi; pii ans = {-1, -1}; for(auto to : g[v]){ int u = to.F, w = to.S; if(u == p) continue; auto ret = dfs(u, nd, v, w); if(ret.F == -infi) continue; if(mx < ret.F){ mx = ret.F; ans = ret.S; } } if(mx != -infi){ if(mx < w){ mx = w; ans = {p, v}; } } return {mx, ans}; } void solve() { cin >> n >> m; for(int i = 1; i <= m; i++){ int a, b, w; cin >> a >> b >> w; edg[i] = {w, {a, b}}; } for(int i = 1; i <= n; i++) p[i] = i, sz[i] = 1; sort(edg + 1, edg + m + 1); vector<pair<int, pii>> rt = {}; for(int i = m; i >= 1; i--){ auto ret = dfs(edg[i].S.F, edg[i].S.S, -1, -infi); if(ret.F != -infi){ int ps = 0; for(int j = 0; j < sz(g[ret.S.F]); j++){ if(g[ret.S.F][j].F == ret.S.S) ps = j; } g[ret.S.F].erase(g[ret.S.F].begin() + ps); for(int j = 0; j < sz(g[ret.S.S]); j++){ if(g[ret.S.S][j].F == ret.S.F) ps = j; } g[ret.S.S].erase(g[ret.S.S].begin() + ps); } g[edg[i].S.F].push_back({edg[i].S.S, edg[i].F}); g[edg[i].S.S].push_back({edg[i].S.F, edg[i].F}); vec[i] = ret; int ps = -1; for(int j = 0; j < sz(rt); j++){ auto e = rt[j]; if((e.S.F == ret.S.F && e.S.S == ret.S.S && e.F == ret.F) || (e.S.F == ret.S.S && e.S.S == ret.S.F && e.F == ret.F)) ps = j; } if(ps != -1) rt.erase(rt.begin() + ps); rt.insert(rt.begin(), edg[i]); } for(int i = 1; i <= n; i++) g[i].clear(); int cur = 0; vector<pair<int, pii>> lf = {}; int q; cin >> q; while(q--){ int x; cin >> x; while(cur < m && edg[cur + 1].F <= x){ cur++; int ha = -1; for(int j = 0; j < sz(rt); j++){ auto e = rt[j]; if((e.S.F == edg[cur].S.F && e.S.S == edg[cur].S.S && e.F == edg[cur].F) || (e.S.F == edg[cur].S.S && e.S.S == edg[cur].S.F && e.F == edg[cur].F)) ha = j; } if(ha != -1) rt.erase(rt.begin() + ha); if(vec[cur].F != -infi){ auto it = lower_bound(all(rt), vec[cur]); rt.insert(it, vec[cur]); } int i = cur; auto ret = dfs(edg[i].S.F, edg[i].S.S, -1, -infi); if(ret.F != -infi){ int ps = 0; for(int j = 0; j < sz(g[ret.S.F]); j++){ if(g[ret.S.F][j].F == ret.S.S) ps = j; } g[ret.S.F].erase(g[ret.S.F].begin() + ps); for(int j = 0; j < sz(g[ret.S.S]); j++){ if(g[ret.S.S][j].F == ret.S.F) ps = j; } g[ret.S.S].erase(g[ret.S.S].begin() + ps); } g[edg[i].S.F].push_back({edg[i].S.S, -edg[i].F}); g[edg[i].S.S].push_back({edg[i].S.F, -edg[i].F}); int ps = -1; for(int j = 0; j < sz(lf); j++){ auto e = lf[j]; if((e.S.F == ret.S.F && e.S.S == ret.S.S && e.F == -ret.F) || (e.S.F == ret.S.S && e.S.S == ret.S.F && e.F == -ret.F)) ps = j; } if(ps != -1) lf.erase(ps + lf.begin()); lf.insert(lf.begin(), edg[i]); } ll ans = 0; auto itl = lf.begin(), itr = rt.begin(); while(itl != lf.end() || itr != rt.end()){ pair<int, pii> ha; if(itl == lf.end()){ ha = *itr; itr++; }else if(itr == rt.end()){ ha = *itl; itl++; }else if((x - itl->F) < (itr->F - x)){ ha = *itl; itl++; }else{ ha = *itr; itr++; } if(getp(ha.S.F) == getp(ha.S.S)) continue; uni(ha.S.S, ha.S.F); ans += abs((ll)x - (ll)ha.first); } clear(); cout << ans << '\n'; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; for(int i = 1; i <= t; i ++){ 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...