답안 #457984

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
457984 2021-08-07T17:03:48 Z Plurm 시간이 돈 (balkan11_timeismoney) C++11
55 / 100
2000 ms 2524 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 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 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 7 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 Incorrect 0 ms 204 KB Output isn't 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 Incorrect 3 ms 204 KB Output isn't correct
16 Execution timed out 2076 ms 2500 KB Time limit exceeded
17 Execution timed out 2090 ms 2368 KB Time limit exceeded
18 Execution timed out 2066 ms 2524 KB Time limit exceeded
19 Execution timed out 2063 ms 1048 KB Time limit exceeded
20 Execution timed out 2088 ms 748 KB Time limit exceeded