Submission #1231688

#TimeUsernameProblemLanguageResultExecution timeMemory
1231688sadddtimeismoney (balkan11_timeismoney)C++20
100 / 100
832 ms1612 KiB
#include<bits/stdc++.h> #include <cmath> #include<fstream> #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) using namespace std; #define sz(a) (int)a.size() #define ALL(v) v.begin(), v.end() #define ALLR(v) v.rbegin(), v.rend() #define ll long long #define pb push_back #define ld long double #define vt vector #include<fstream> #define fi first #define se second #define pll pair<ll, ll> #define pii pair<int, int> #define mpp make_pair const int mxn = 100000, sq = 400; const ll inf = 1e13, mod = 998244353, pr = 37; const int dx[4] = {0, 0, 1, -1}; const int dy[4] = {1, -1, 0, 0}; #define ull unsigned long long mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll INF = numeric_limits<ll>::max() / 4; #define vi vector<int> struct E{ ll u, v, w, id; bool operator <(const E &other){ return(w < other.w); } }; int n, m; ll eu[mxn + 1], ev[mxn + 1], et[mxn + 1], ec[mxn + 1]; int pa[mxn + 1]; struct P{ ll t, c; P(){ t = c = 0; } }; vector<P>candidates; vt<int>ansedge; ll ans = inf; P anspoint; int fp(int u){ if(pa[u] < 0)return(u); return(pa[u] = fp(pa[u])); } bool unon(int u, int v){ u = fp(u); v = fp(v); if(u == v)return(0); if(-pa[u] < -pa[v])swap(u, v); pa[u] += pa[v]; pa[v] = u; return(1); } P find_mst(ll coef_c, ll coef_t){ //cout << coef_c << " " << coef_t << " "; vt<E>edge; for(int i = 0; i < m; i++){ edge.pb({eu[i], ev[i], et[i] * coef_t + ec[i] * coef_c, i}); } sort(ALL(edge)); for(int i = 0; i < n; i++)pa[i] = -1; P res; vt<int>idedge; for(auto [u, v, w, i]: edge){ if(unon(u, v)){ res.t += et[i]; res.c += ec[i]; idedge.pb(i); } } //cout << res.t << " " << res.c << "\n"; if(res.t * res.c < ans){ ans = res.t * res.c; ansedge = idedge; anspoint = res; } return(res); } void dnc(P l, P r){ P mid = find_mst(l.t - r.t, r.c - l.c); if(mid.c == l.c && mid.t == l.t)return; if(mid.c == r.c && mid.t == r.t)return; dnc(l, mid); dnc(mid, r); } void solve(){ cin >> n >> m; for(int i = 0; i < m; i++){ cin >> eu[i] >> ev[i] >> et[i] >> ec[i]; } P upper_point = find_mst(1, 0), lower_point = find_mst(0, 1); dnc(upper_point, lower_point); cout << anspoint.t << " " << anspoint.c << "\n"; for(auto i: ansedge){ cout << eu[i] << " " << ev[i] << "\n"; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tt; tt = 1; while(tt--){ solve(); } return(0); }
#Verdict Execution timeMemoryGrader output
Fetching results...