Submission #1354829

#TimeUsernameProblemLanguageResultExecution timeMemory
1354829Francisco_MartinBikes vs Cars (EGOI23_bikesvscars)C++20
100 / 100
213 ms16140 KiB
//EGOI 2023 Bikes vs Cars
//https://qoj.ac/contest/1354/problem/7157

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
const ll MAXN = 505;

vll uf(MAXN,-1);
ll ufind(ll v){
    if(uf[v]<0) return v;
    return uf[v]=ufind(uf[v]);
}
bool unite(ll v,ll u){
    v=ufind(v); u=ufind(u);
    if(v==u) return false;
    if(uf[v]>uf[u]) swap(v,u);
    uf[v]+=uf[u]; uf[u]=v; return true;
}

void mst(vector<array<ll,3>> edges,vector<array<ll,3>> &ans){
    fill(uf.begin(),uf.end(),-1);
    for(auto [w,v,u]:edges) if(unite(v,u)) ans.push_back({w,v,u});
}

int main(){
    ll n, w, a;
    cin >> n >> w;
    vector<vll> A(n,vll(n)), B(n,vll(n)); vector<array<ll,3>> edges, ans;
    for(int j=0; j<n; j++) for(int i=0; i<j; i++) cin >> a, A[i][j]=w-a;
    for(int j=0; j<n; j++) for(int i=0; i<j; i++) cin >> B[i][j];
    for(int j=0; j<n; j++) for(int i=0; i<j; i++) if(A[i][j]<=B[i][j]){
        edges.push_back({A[i][j],i,j}); edges.push_back({B[i][j],i,j});
    }
    sort(edges.begin(),edges.end()); mst(edges,ans);
    sort(edges.rbegin(),edges.rend()); mst(edges,ans);
    vector<vll> A2(n,vll(n,1e18)), B2(n,vll(n,-1e18));
    for(auto [w,v,u]:ans) A2[v][u]=A2[u][v]=min(A2[v][u],w), B2[v][u]=B2[u][v]=max(B2[v][u],w);
    for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++){
        A2[i][j]=min(A2[i][j],max(A2[i][k],A2[k][j]));
    }
    for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++){
        B2[i][j]=max(B2[i][j],min(B2[i][k],B2[k][j]));
    }
    for(int j=0; j<n; j++) for(int i=0; i<j; i++){
        if(A[i][j]!=A2[i][j] || B[i][j]!=B2[i][j]){cout << "NO\n"; return 0;}
    }
    cout << ans.size() << "\n";
    for(auto [w,v,u]:ans) cout << v << " " << u << " " << w << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...