Submission #1171373

#TimeUsernameProblemLanguageResultExecution timeMemory
1171373amirhoseinfar1385timeismoney (balkan11_timeismoney)C++20
5 / 100
11 ms2152 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define int ll
using namespace std;
struct yal{
    int u,v,x,y,ax,ay;
    int getad(int fu){
        return (u^v^fu);
    }
};
vector<yal>ally;
int n,m,inf=1e16;
const int maxn=205;

struct dsu{
    int par[maxn];
    int root(int u){
        if(u==par[u]){
            return u;
        }
        return par[u]=root(par[u]);
    }
    int con(int u,int v){
        u=root(u);
        v=root(v);
        if(u!=v){
            par[u]=v;
            return 1;
        }
        return 0;
    }
    void clear(){
        for(int i=0;i<maxn;i++){
            par[i]=i;
        }
    }
    dsu(){
        for(int i=0;i<maxn;i++){
            par[i]=i;
        }
    }
}ds;
pair<int,int>mainres;

bool cmp(yal a,yal b){
    return a.ax+a.ay>b.ax+b.ay;
}

pair<int,int>findmst(int s,int z,int w=0){
    vector<yal>fake;
    for(int i=0;i<(int)ally.size();i++){
        auto f=ally[i];
        f.ax=f.x*s;
        f.ay=f.y*z;
        fake.push_back(f);
    }
    sort(fake.begin(),fake.end(),cmp);
    pair<int,int>ret={0,0};
    ds.clear();
    vector<pair<int,int>>kh;
    for(int i=0;i<(int)fake.size();i++){
        auto x=fake[i];
        if(ds.con(x.u,x.v)){
            //cout<<x.x<<" "<<x.y<<" "<<x.u<<" "<<x.<<"\n";
            ret.first+=x.x;
            ret.second+=x.y;
            kh.push_back(make_pair(x.u,x.v));
        }
    }
    if(w==1){
        cout<<ret.first<<" "<<ret.second<<"\n";
        for(auto x:kh){
            cout<<x.first<<" "<<x.second<<"\n";
        }
    }
    return ret;
}

void vorod(){
    cin>>n>>m;
    for(int i=0;i<m;i++){
        yal x;
        cin>>x.u>>x.v>>x.x>>x.y;
        ally.push_back(x);
    }
}
int res=inf;

bool lturn(int x1,int y1,int x2,int y2){
    return x1*y2<=x2*y1;
}

bool check(pair<int,int>a,pair<int,int>b,pair<int,int>c){
    return !lturn(b.first-a.first,b.second-a.second,c.first-a.first,c.second-a.second);
}

void calc(pair<int,int>a,pair<int,int>b){
    //cout<<a.first<<" "<<a.second<<" "<<b.first<<" "<<b.second<<"\n";
    int s=-a.first+b.first;
    int z=-b.second+a.second;
    pair<int,int>tof=findmst(s,z);
    res=min(res,tof.first*tof.second);
    if(tof.first*tof.second==res){
        mainres={s,z};
    }
    //cout<<"ha: "<<tof.first<<" "<<tof.second<<"\n";
    if(check(a,b,tof)){
        calc(a,tof);
        calc(tof,b);
    }
}

void khor(){
    //cout<<mainres.first<<" "<<mainres.second<<"\n";
    findmst(mainres.first,mainres.second,1);
}

void solve(){
    vorod();
    pair<int,int>a=findmst(0,1);
    pair<int,int>b=findmst(1,0);
    res=min(a.first*a.second,b.first*b.second);
    if(a.first*a.second==res){
        mainres={0,1};
    }else{
        mainres={1,0};
    }
    calc(a,b);
    //cout<<res<<"\n";
    khor();
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    //cin>>t;
    for(int asd=0;asd<t;asd++){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...