Submission #788487

#TimeUsernameProblemLanguageResultExecution timeMemory
788487AmirElarbitimeismoney (balkan11_timeismoney)C++14
100 / 100
677 ms676 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#define INF 1e9
#define ve vector
#define vi ve<int>
#define ii pair<int,int>
#define vii ve<ii>
#define pb push_back
#define fi first
#define se second
#define ll long long
using namespace __gnu_pbds;
using namespace std;
const int nax = 1e4+5;
const int kax = 25+5;
#include<bits/stdc++.h>
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
int par[nax];
int findpar(int u){
    if(par[u] == u) return u;
    return par[u] = findpar(par[u]);
}
bool isSameSet(int u, int v){
    return (findpar(u) == findpar(v));
}
void unionSet(int u, int v){
    u = findpar(u), v = findpar(v);
    if(u == v) return;
    par[u] = v;
}
ll cross(ii a, ii b, ii c){
    return (b.fi-a.fi)*(c.se-b.se) - (c.fi-b.fi) * (b.se-a.se);
}   
vii cur;
ll curval;
int n,m, x[nax], y[nax], c[nax], t[nax];
ii MST(ve<ii> &edge){
    for (int i = 0; i < n; ++i)
    {
        par[i] = i;
    }
    sort(edge.begin(), edge.end());
    cur.clear();
    int smt = 0, smc = 0;
    for(auto v : edge){
        if(!isSameSet(x[v.se], y[v.se])){
            unionSet(x[v.se], y[v.se]);
            cur.pb({x[v.se], y[v.se]});
            smt += t[v.se], smc += c[v.se];
        }
    }
    curval = smt*1ll*smc;
    return {smt, smc};
}
int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 0; i < m; ++i)
    {
        cin >> x[i] >> y[i] >> t[i] >> c[i];
    }
    ve<ii> edge;
    for(int i = 0; i < m; i++) edge.pb({t[i], i});
    ii a = MST(edge);
    vii ans = cur;
    ii aff = a;
    ll ansval = curval;
    edge.clear(); 
    for(int i = 0; i < m; i++) edge.pb({c[i], i});
    ii b = MST(edge);
    if(ansval > curval){
        ansval = curval;
        ans = cur;
        aff = b;
    }
    queue<pair<ii,ii>> bfs;
    bfs.push({a,b});
    while(!bfs.empty()){
        ii a = bfs.front().fi, b = bfs.front().se;
        bfs.pop();
        edge.clear(); 
        for(int i = 0; i < m; i++) edge.pb({c[i]*(b.fi-a.fi)-t[i]*(b.se-a.se), i});
        ii p = MST(edge);
        if(ansval > curval){
            ansval = curval;
            ans = cur;
            aff = p;
        }
        if(cross(a,b,p) >= 0) continue;
        bfs.push({a,p});
        bfs.push({p,b});
    }
    cout << aff.fi << " " << aff.se << endl;
    for(auto x : ans){
        cout << x.fi << " " << x.se << endl;
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...