답안 #457995

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
457995 2021-08-07T17:37:07 Z Plurm 시간이 돈 (balkan11_timeismoney) C++11
15 / 100
2000 ms 65540 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;
		}
};
 
tuple<int,int,int> compute_value(int a, int 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 make_tuple(st * sc, a, b);
}
 
tuple<int,int,int> track_min(tuple<int,int,int> x, tuple<int,int,int> y){
	if(get<0>(x) > get<0>(y)) return y;
	else return x;
}
 
tuple<int,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 mv = compute_value(am, bm);
	auto ret = track_min(lv, track_min(rv, mv));
	if(get<0>(lv) < get<0>(mv) || get<0>(rv) < get<0>(mv)) return ret;
    ret = track_min(ret, search(a1, b1, am, bm));
	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:66:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |  scanf("%d%d",&n,&m);
      |  ~~~~~^~~~~~~~~~~~~~
timeismoney.cpp:69:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |   scanf("%d%d%d%d",&x,&y,&t,&c);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2063 ms 6916 KB Time limit exceeded
2 Runtime error 1425 ms 65540 KB Execution killed with signal 9
3 Execution timed out 2048 ms 65540 KB Time limit exceeded
4 Execution timed out 2036 ms 18660 KB Time limit exceeded
5 Execution timed out 2089 ms 3524 KB Time limit exceeded
6 Execution timed out 2079 ms 4288 KB Time limit exceeded
7 Execution timed out 2061 ms 1032 KB Time limit exceeded
8 Execution timed out 2086 ms 884 KB Time limit exceeded
9 Runtime error 1478 ms 65540 KB Execution killed with signal 9
10 Correct 0 ms 204 KB Output is correct
11 Execution timed out 2073 ms 65536 KB Time limit exceeded
12 Execution timed out 2083 ms 18952 KB Time limit exceeded
13 Correct 1 ms 204 KB Output is correct
14 Correct 2 ms 304 KB Output is correct
15 Incorrect 1 ms 204 KB Output isn't correct
16 Incorrect 8 ms 332 KB Output isn't correct
17 Incorrect 6 ms 332 KB Output isn't correct
18 Execution timed out 2080 ms 1032 KB Time limit exceeded
19 Incorrect 34 ms 712 KB Output isn't correct
20 Incorrect 117 ms 672 KB Output isn't correct