Submission #1170083

#TimeUsernameProblemLanguageResultExecution timeMemory
1170083mychecksedadReconstruction Project (JOI22_reconstruction)C++20
70 / 100
5102 ms460792 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30; int s[N], p[N]; struct Dsu{ Dsu(int n){ for(int j = 0; j <= n; ++j) s[j] = 1, p[j] = j; } int find(int v){ if(p[v] == v) return v; return p[v] = find(p[v]); } bool merge(int u, int v){ u = find(u); v = find(v); if(u != v){ if(s[u] > s[v] )swap(u, v); p[u] = v; s[v] += s[u]; return true; } return false; } bool merge(array<int, 3> e){ int u = e[1], v = e[2]; u = find(u); v = find(v); if(u != v){ if(s[u] > s[v] )swap(u, v); p[u] = v; s[v] += s[u]; return true; } return false; } }; int n, m, q, maxL[N], maxR[N]; vector<array<int, 3>> E; vi L[N], R[N]; void solve(){ cin >> n >> m; E.resize(m); for(auto &[w, u, v]: E) cin >> u >> v >> w; sort(all(E), [&](const array<int, 3> &x, const array<int, 3> &y){ return x[0] < y[0]; }); for(int i = 0; i < m; ++i){ maxL[i] = maxR[i] = i; } L[0].pb(0); for(int i = 1; i < m; ++i){ Dsu d(n); d.merge(E[i]); L[i].pb(i); for(int j = int(L[i - 1].size())-1; j >= 0; --j){ if(d.merge(E[L[i - 1][j]])) L[i].pb(L[i - 1][j]); } reverse(all(L[i])); } R[m - 1].pb(m - 1); for(int i = m - 2; i >= 0; --i){ Dsu d(n); d.merge(E[i]); R[i].pb(i); for(int j = 0; j < R[i + 1].size(); ++j){ if(d.merge(E[R[i + 1][j]])) R[i].pb(R[i + 1][j]); } } for(int i = 0; i < m; ++i){ for(int x: L[i]) maxR[x] = max(maxR[x], i); for(int x: R[i]) maxL[x] = min(maxL[x], i); } cin >> q; for(int i = 1; i <= q; ++i){ ll x; cin >> x; int pos = upper_bound(all(E), array<int, 3>{(int)x, -1, -1}) - E.begin(); --pos; // Dsu d(n); int l = pos == -1 ? -1 : int(L[pos].size()) - 1; int r = 0; int sz = 1; ll ans = 0; while(sz < n){ if(l == -1){ if(maxL[R[pos + 1][r]] <= (pos == -1 || l + 1 == L[pos].size() ? INT_MAX : L[pos][l + 1])){ // d.merge(E[R[pos + 1][r]])){ ans += abs(E[R[pos + 1][r]][0] - x); ++sz; } ++r; }else if(pos + 1 == m || r == R[pos + 1].size()){ if(maxR[L[pos][l]] >= (r == 0 ? INT_MIN : R[pos + 1][r - 1])){ ans += abs(E[L[pos][l]][0] - x); ++sz; } --l; }else if(x - E[L[pos][l]][0] <= E[R[pos + 1][r]][0] - x){ if(maxR[L[pos][l]] >= (r == 0 ? INT_MIN : R[pos + 1][r - 1])){ ans += abs(E[L[pos][l]][0] - x); ++sz; } --l; }else{ if(maxL[R[pos + 1][r]] <= (l + 1 == L[pos].size() ? INT_MAX : L[pos][l + 1])){ ans += abs(E[R[pos + 1][r]][0] - x); ++sz; } ++r; } } cout << ans << '\n'; } } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); en; } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; 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...