답안 #457983

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
457983 2021-08-07T16:49:56 Z Plurm 시간이 돈 (balkan11_timeismoney) C++11
75 / 100
2000 ms 2316 KB
#include <bits/stdc++.h>
using namespace std;

function<bool(tuple<int,int,int,int>,tuple<int,int,int,int>)> get_comp(int a, int b){
	return [a, b](tuple<int,int,int,int> x, tuple<int,int,int,int> y){
		return a*get<2>(x) + b*get<3>(x) < a*get<2>(y) + b*get<3>(y);
	};
}

int n, m;
vector<tuple<int,int,int,int> > edges;

class DSU{
	private:
		int p[256];
	public:
		DSU(){
			memset(p, -1, sizeof(p));
		}
		int f(int u){
			if(p[u] == -1) return u;
			else return p[u] = f(p[u]);
		}
		bool u(int x, int y){
			x = f(x); y = f(y);
			if(x == y) return false;
			p[x] = y;
			return true;
		}
};

map<pair<int,int>, tuple<long long,int,int> > memoiz;

tuple<long long,int,int> compute_value(int a, int b){
	if(memoiz.count(make_pair(a, b))) return memoiz[make_pair(a,b)];
	// Careful! This function takes O(M log M + N)
	sort(edges.begin(), edges.end(), get_comp(a,b));
	DSU d;
	int st = 0, sc = 0;
	for(auto e : edges){
		int x, y, t, c; tie(x, y, t, c) = e;
		if(d.u(x, y)){
			st += t;
			sc += c;
		}
	}
	return memoiz[make_pair(a,b)] = make_tuple(1ll * st * sc, a, b);
}

tuple<long long,int,int> track_min(tuple<long long,int,int> x, tuple<long long,int,int> y){
	if(get<0>(x) > get<0>(y)) return y;
	else return x;
}

tuple<long long,int,int> search(int a1, int b1, int a2, int b2){
	auto lv = compute_value(a1, b1);
	auto rv = compute_value(a2, b2);
	int am = a1 + a2;
	int bm = b1 + b2;
	auto ret = track_min(lv, rv);
	if(get<0>(lv) < get<0>(rv)){
		ret = track_min(ret, search(a1, b1, am, bm));
	}else if(get<0>(lv) > get<0>(rv)){
		ret = track_min(ret, search(am, bm, a2, b2));
	}
	return ret;
}

int main(){
	scanf("%d%d",&n,&m);
	int x, y, t, c;
	for(int i = 0; i < m; i++){
		scanf("%d%d%d%d",&x,&y,&t,&c);
		edges.emplace_back(x,y,t,c);
	}
	auto ans = search(1, 0, 0, 1);
	sort(edges.begin(), edges.end(), get_comp(get<1>(ans), get<2>(ans)));
	DSU d;
	int st = 0, sc = 0;
	vector<pair<int,int> > ansvec;
	for(auto e : edges){
		tie(x, y, t, c) = e;
		if(d.u(x, y)){
			st += t;
			sc += c;
			ansvec.emplace_back(x, y);
		}
	}
	printf("%d %d\n", st, sc);
	for(auto p : ansvec){
		printf("%d %d\n", p.first, p.second);
	}
	return 0;
}

Compilation message

timeismoney.cpp: In function 'int main()':
timeismoney.cpp:70:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |  scanf("%d%d",&n,&m);
      |  ~~~~~^~~~~~~~~~~~~~
timeismoney.cpp:73:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |   scanf("%d%d%d%d",&x,&y,&t,&c);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 204 KB Output is correct
7 Correct 2 ms 332 KB Output is correct
8 Correct 10 ms 588 KB Output is correct
9 Correct 0 ms 204 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 1 ms 204 KB Output is correct
12 Incorrect 1 ms 204 KB Output isn't correct
13 Correct 1 ms 204 KB Output is correct
14 Incorrect 2 ms 204 KB Output isn't correct
15 Correct 1 ms 204 KB Output is correct
16 Execution timed out 2079 ms 2316 KB Time limit exceeded
17 Correct 4 ms 332 KB Output is correct
18 Incorrect 8 ms 332 KB Output isn't correct
19 Correct 17 ms 672 KB Output is correct
20 Incorrect 35 ms 588 KB Output isn't correct