Submission #1242178

#TimeUsernameProblemLanguageResultExecution timeMemory
1242178MateiKing80timeismoney (balkan11_timeismoney)C++20
100 / 100
539 ms704 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int BULAN = 1000;
const ll inf = 1e15;

struct Edge {
	int u, v, a, b;
};

struct DSU {
	vector<int> tati;
	DSU (int n) {
		tati.resize(n + 1, -1);
	}
	int real(int x) {
		if (tati[x] < 0)
			return x;
		return tati[x] = real(tati[x]);
	}
	bool join(int x, int y) {
		x = real(x);
		y = real(y);
		if (x == y)
			return false;
		if (-tati[x] < -tati[y])
			swap(x, y);
		tati[x] += tati[y];
		tati[y] = x;
		return true;
	}
};

int main() {
	int n, m;
	cin >> n >> m;
	vector<Edge> e;
	for (int i = 0; i < m; i ++) {
		Edge x;
		cin >> x.u >> x.v >> x.a >> x.b;
		e.push_back(x);
	}
	ll bestAns = inf;
	int besta = 0, bestb = 0;
	
	for (int i = 0; i <= BULAN; i ++) {
		sort(e.begin(), e.end(), [&] (Edge a, Edge b) {return 1ll * a.a * BULAN + 1ll * a.b * i < 1ll * b.a * BULAN + 1ll * b.b * i;});
		DSU ds(n);
		int sumA = 0, sumB = 0;
		for (auto j : e) {
			if (ds.join(j.u, j.v)) {
				sumA += j.a;
				sumB += j.b;
			}
		}
		if (1ll * sumA * sumB < bestAns) {
			bestAns = 1ll * sumA * sumB;
			besta = BULAN;
			bestb = i;
		}
	}
	
	for (int i = 0; i <= BULAN; i ++) {
		sort(e.begin(), e.end(), [&] (Edge a, Edge b) {return 1ll * a.b * BULAN + 1ll * a.a * i < 1ll * b.b * BULAN + 1ll * b.a * i;});
		DSU ds(n);
		int sumA = 0, sumB = 0;		
		for (auto j : e) {
			if (ds.join(j.u, j.v)) {
				sumA += j.a;
				sumB += j.b;
			}
		}
		if (1ll * sumA * sumB < bestAns) {
			bestAns = 1ll * sumA * sumB;
			bestb = BULAN;
			besta = i;
		}
	}
	
	sort(e.begin(), e.end(), [&] (Edge a, Edge b) {return 1ll * a.a * besta + 1ll * a.b * bestb < 1ll * b.a * besta + 1ll * b.b * bestb;});
	DSU ds(n);
	int sumA = 0, sumB = 0;
	vector<pair<int, int>> afis;
	for (auto j : e) {
		if (ds.join(j.u, j.v)) {
			sumA += j.a;
			sumB += j.b;
			afis.push_back({j.u, j.v});
		}
	}
	cout << sumA << " " << sumB << '\n';
	for (auto i : afis)
		cout << i.first << " " << i.second << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...