# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
457982 | Plurm | 시간이 돈 (balkan11_timeismoney) | C++11 | 2099 ms | 65540 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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{
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;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |