Submission #446112

#TimeUsernameProblemLanguageResultExecution timeMemory
446112Evirirtimeismoney (balkan11_timeismoney)C++17
100 / 100
1094 ms2024 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define watch(x) cout<<(#x)<<"="<<(x)<<'\n' #define mset(d,val) memset(d,val,sizeof(d)) #define setp(x) cout<<fixed<<setprecision(x) #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) #define forn(i,a,b) for(int i=(a);i<(b);i++) #define fore(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back #define F first #define S second #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<ll,ll> ii; typedef vector<ll> vi; typedef vector<ii> vii; typedef long double ld; template<typename T> using pbds = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; void SD(int t=0){ cout<<"PASSED "<<t<<endl; } const ll INF = ll(1e18); const int MOD = 998244353; const bool DEBUG = 0; const int MAXN = 205; const int MAXM = 10005; struct DSU { struct Node{ int p, sz; }; int cc; vector<Node> dsu; DSU(int n){ dsu.resize(n); cc=n; forn(i,0,n){ dsu[i]={i,1}; } } int rt(int u){ return (dsu[u].p==u) ? u : dsu[u].p=rt(dsu[u].p); } bool sameset(int u, int v){ return rt(u)==rt(v); } void merge(int u, int v) { u=rt(u); v=rt(v); if(u==v) return; if(dsu[u].sz<dsu[v].sz) swap(u,v); dsu[u].sz+=dsu[v].sz; dsu[v].p=dsu[u].p; cc--; } }; struct Edge { int u,v; ll x,y; int id; bool operator<(const Edge& e){ return x+y < e.x+e.y; } }; int n,m; vector<Edge> edges; vector<ii> bestedges; ii best={3e9,3e9}; ll besta,bestb; ii solve(ll a, ll b, bool fin=false) { vector<Edge> ve; for(Edge e: edges) { ve.pb({e.u, e.v, a*e.x, b*e.y, e.id}); } sort(ve.begin(), ve.end()); DSU dsu(n); ll sumx=0,sumy=0; for(Edge e: ve) { if(dsu.cc==1) break; int u=e.u, v=e.v; if(dsu.sameset(u,v)) continue; dsu.merge(u,v); sumx+=edges[e.id].x; sumy+=edges[e.id].y; if(fin) bestedges.pb({u,v}); } ii res=ii(sumx, sumy); if(res.F*res.S < best.F*best.S) { best=res; besta=a; bestb=b; } return res; } bool good(ii a, ii b, ii c) { return (c.S-b.S)*(b.F-a.F)>(b.S-a.S)*(c.F-b.F); } void rec(ii a, ii b) { ii res=solve(a.S-b.S, b.F-a.F); if(good(a,res,b)) { rec(a,res); rec(res,b); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; forn(i,0,m) { int u,v,x,y; cin>>u>>v>>x>>y; edges.pb(Edge{u,v,x,y,i}); } ii minx=solve(1,0); ii miny=solve(0,1); rec(minx, miny); solve(besta, bestb, true); cout<<best.F<<" "<<best.S<<'\n'; for(auto e: bestedges) cout<<e.F<<" "<<e.S<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...