제출 #1126672

#제출 시각아이디문제언어결과실행 시간메모리
1126672ttamx시간이 돈 (balkan11_timeismoney)C++20
100 / 100
861 ms636 KiB
#include<bits/stdc++.h>

using namespace std;

const int N=205;
const int M=10005;

int n,m;
int u[M],v[M],t[M],c[M];
tuple<int,int,int> best(1e9,0,0);
vector<pair<int,int>> ans;

pair<int,int> mst(int mx,int my,bool save=false){
    auto calc=[&](int i){
        return mx*t[i]+my*c[i];
    };
    vector<int> ord(m);
    iota(ord.begin(),ord.end(),0);
    sort(ord.begin(),ord.end(),[&](int i,int j){
        return calc(i)<calc(j);
    });
    vector<int> fa(n);
    iota(fa.begin(),fa.end(),0);
    function<int(int)> fp=[&](int u){
        return fa[u]=u==fa[u]?u:fp(fa[u]);
    };
    int val=0,x=0,y=0;
    for(auto i:ord){
        int pu=fp(u[i]),pv=fp(v[i]);
        if(pu==pv)continue;
        if(save)ans.emplace_back(u[i],v[i]);
        val+=calc(i);
        x+=t[i],y+=c[i];
        fa[pv]=pu;
    }
    best=min(best,{x*y,mx,my});
    return {x,y};
}

void dnc(int xl,int yl,int xr,int yr){
    auto [xm,ym]=mst(yl-yr,xr-xl);
    if((xl-xr)*(ym-yr)-(xm-xr)*(yl-yr)<=0)return;
    dnc(xl,yl,xm,ym);
    dnc(xm,ym,xr,yr);
}

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> m;
    for(int i=0;i<m;i++){
        cin >> u[i] >> v[i] >> t[i] >> c[i];
    }
    auto [xl,yl]=mst(1,0);
    auto [xr,yr]=mst(0,1);
    dnc(xl,yl,xr,yr);
    auto [res,mx,my]=best;
    auto [ansx,ansy]=mst(mx,my,true);
    cout << ansx << " " << ansy << "\n";
    for(auto [u,v]:ans){
        cout << u << " " << v << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...