Submission #373523

#TimeUsernameProblemLanguageResultExecution timeMemory
373523MatheusLealVtimeismoney (balkan11_timeismoney)C++17
90 / 100
2097 ms2000 KiB
#include <bits/stdc++.h> #define N 210 #define f first #define s second #define pb push_back #define mp make_pair #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() using namespace std; typedef pair<int, int> pii; int n, m; vector<pair<int, pii> > grafo[N]; int pai[N], peso[N]; int Find(int x){ if(x == pai[x]) return x; return pai[x] = Find(pai[x]); } bool join(int a, int b){ a = Find(a); b = Find(b); if(a==b) return 0; if(peso[a]<peso[b])swap(a,b); pai[b]=a; if(peso[a]==peso[b])peso[a]++; return 1; } vector< pii > good, curr; pair<int,pii> get(int A, int B){ // cout<<"sss "<<A<<" "<<B<<"\n"; vector< array<int, 5> > arestas; curr.clear(); for(int i = 1; i <= n; i++){ pai[i]=i,peso[i] = 0; for(auto v: grafo[i]){ int cost = A*v.s.f + B*v.s.s; arestas.pb({cost, v.s.f, v.s.s, i, v.f}); } } int x = 0, y = 0, resp=0; sort(all(arestas)); for(auto e: arestas){ int cost = e[0], xi = e[1], yi = e[2], a = e[3], b = e[4]; if(join(a, b)){ curr.pb({a, b}); x += xi; y += yi; resp += cost; } } return mp(resp, pii(x, y)); } bool cross(pii A, pii B, pii C){ return 1LL*(A.f - C.f)*(B.s - C.s) - 1LL*(A.s - C.s)*(B.f - C.f) != 0LL; } auto ans = mp((int)(1e9),pii(-1,-1)); void solve(pii L, pii R){ //cout<<"A "<<L.f<<" "<<L.s<<" // "<<R.f<<" "<<R.s<<"\n"; pii slope = {(L.s - R.s), (R.f - L.f)}; auto closest = get(slope.f, slope.s); if(closest.s.f * closest.s.s < ans.f){ ans.f = closest.s.f*closest.s.s; ans.s = closest.s; swap(good, curr); } if(!cross(L, R, closest.s)) return; //checa em qual semiplano ta if(slope.f*closest.s.f + slope.s*closest.s.s >= slope.f*L.f + slope.s*L.s) return; if(slope.f*closest.s.f + slope.s*closest.s.s >= slope.f*R.f + slope.s*R.s) return; solve(L, closest.s),solve(closest.s, R); } int32_t main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i = 1; i <= m; i++){ int a, b,c,d; cin>>a>>b>>c>>d; a++,b++; grafo[a].push_back({b, {c, d}}); grafo[b].push_back({a, {c, d}}); } auto R = get(0, 1); if(R.s.f*R.s.s < ans.f){ ans.f = R.s.f*R.s.s; ans.s=R.s; swap(good, curr); } auto L = get(1, 0); if(L.s.f*L.s.s < ans.f){ ans.f = L.s.f*L.s.s; ans.s=L.s; swap(good, curr); } solve(L.s, R.s); cout<<ans.s.f<<" "<<ans.s.s<<"\n"; for(auto e: good){ cout<<e.f-1<<" "<<e.s-1<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...