답안 #1061910

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1061910 2024-08-16T15:10:05 Z nishkarsh 시간이 돈 (balkan11_timeismoney) C++14
100 / 100
819 ms 1364 KB
#include <bits/stdc++.h>
#define ll long long
#define vt vector
#define pb push_back
using namespace std;

int fastexp(int b, int e, int mod){
	int ans = 1;
	while(e){
		if(e&1) ans = (1ll*ans*b)%mod;
		b = (1ll*b*b)%mod;
		e >>= 1;
	}
	return ans;
}

const int N = 1e4+1;
const int mod = 998244353;
const ll INFLL = 1e18;
const int INF = 2e9;

struct dsu{
	int n, *p;
	dsu(int _n){
		n = _n;
		p = new int[n];
		for(int i = 0; i < n; i++) p[i] = -1;
	}
	int find(int u){
		if(p[u] < 0) return u;
		else return p[u] = find(p[u]);
	}
	bool unite(int u, int v){
		u = find(u); v = find(v);
		if(u == v) return false;
		p[u] += p[v];
		p[v] = u;
		return true;
	}
};

int u[N],v[N],c[N],m[N];
int n,e,cc,cm;
pair<int,int> ans;

bool operator < (pair<int,int> a, pair<int,int> b){
	return (1ll*a.first*a.second < 1ll*b.first * b.second);
}

pair<int,int> find_mst(int coeff_c, int coeff_m, bool log){
	int ind[e];
	for(int i = 0; i < e; i++) ind[i] = i;
	sort(ind, ind+e, [&] (int i, int j){
		int gg = coeff_c*(c[i] - c[j]) - coeff_m*(m[j] - m[i]);
		if(gg == 0) return c[i] > c[j];
		else return gg < 0;
	});

	dsu DSU(n);

	int cost = 0, money = 0;

	for(int i = 0; i < e; i++){
		int j = ind[i];
		// cout << coeff_c << " " << coeff_m << " " << j << " " << u[j] << " " << v[j] << "\n";
		if(DSU.unite(u[j],v[j])){
			cost += c[j], money += m[j];
			if(log) cout << u[j] << " " << v[j] << "\n";
		}
	}

	pair<int,int> gg = make_pair(cost,money);

	if(gg < ans) ans = gg, cc = coeff_c, cm = coeff_m;
	return gg;
}

void divide(int xl, int yl, int xr, int yr){
	auto it = find_mst(yl-yr, xr-xl, false);

	if(((it.first - xl) * (yr - it.second)) == ((xr - it.first) * (it.second - yl))) return;

	divide(xl, yl, it.first, it.second);
	divide(it.first, it.second, xr, yr);
}

void solve(){
	cin >> n >> e;
	for(int i = 0; i < e; i++) cin >> u[i] >> v[i] >> c[i] >> m[i];

	ans = make_pair(50000,50000);

	auto min_x = find_mst(1,0,false);
	auto min_y = find_mst(0,1,false);

	divide(min_x.first, min_x.second, min_y.first, min_y.second);

	cout << ans.first << " " << ans.second << "\n";
	find_mst(cc, cm, true);

}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int t = 1;
	// cin >> t;
	while(t--){
		solve();
	}

	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 456 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 5 ms 732 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 604 KB Output is correct
14 Correct 5 ms 344 KB Output is correct
15 Correct 3 ms 604 KB Output is correct
16 Correct 90 ms 976 KB Output is correct
17 Correct 95 ms 924 KB Output is correct
18 Correct 89 ms 852 KB Output is correct
19 Correct 814 ms 1364 KB Output is correct
20 Correct 819 ms 1364 KB Output is correct