Submission #1354953

#TimeUsernameProblemLanguageResultExecution timeMemory
1354953branches1029Bikes vs Cars (EGOI23_bikesvscars)C++20
100 / 100
192 ms8436 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, w;
int a[505][505];
int b[505][505];
int c[505][505];
int mn[505][505];
int mx[505][505];
vector< tuple<int,int,int> > v[2];
vector< tuple<int,int,int> > e;
int p[505];
int r[505];

int findroot( int i ){
    if( p[i]==i ) return i;
    return p[i]=findroot(p[i]);
}

void MST( int k ){
    for( int i=0 ; i<n ; i++ ){
        p[i]=i;
        r[i]=1;
    }
    for( int i=0 ; i<v[k].size() ; i++ ){
        int z, x, y;
        tie( z, x, y )=v[k][i];
        int xr=findroot(x);
        int yr=findroot(y);
        if( xr!=yr ){
            if( r[yr]>r[xr] ) swap( xr, yr );
            r[xr]+=r[yr];
            p[yr]=xr;
            e.push_back({ x, y, abs(z) });
            //cout << x << ' ' << y << ' ' << z << '\n';
        }
    }
}

int main(){

    //ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> w;
    for( int i=1 ; i<n ; i++ ){
        for( int j=0 ; j<i ; j++ ){
            cin >> c[i][j];
            a[i][j]=w-c[i][j];
        }
    }
    for( int i=1 ; i<n ; i++ ){
        for( int j=0 ; j<i ; j++ ){
            cin >> b[i][j];
            if( b[i][j]>=a[i][j] ){
                v[0].push_back({ a[i][j], i, j });
                v[1].push_back({ -b[i][j], i, j });
            }
        }
    }
    sort( v[0].begin(), v[0].end() );
    sort( v[1].begin(), v[1].end() );
    
    MST( 0 );
    MST( 1 );

    for( int i=0 ; i<n ; i++ ){
        for( int j=0 ; j<n ; j++ ){
            mn[i][j]=2e9;
            mx[i][j]=0;
        }
        mn[i][i]=0;
        mx[i][i]=2e9;
    }
    for( auto u : e ){
        int x, y, z;
        tie( x, y, z )=u;
        mn[x][y]=mn[y][x]=min( mn[x][y], z );
        mx[x][y]=mx[y][x]=max( mx[x][y], z );
    }
    for( int k=0 ; k<n ; k++ ){
        for( int i=0 ; i<n ; i++ ){
            for( int j=0 ; j<n ; j++ ){
                mn[i][j]=min( mn[i][j], max( mn[i][k], mn[k][j] ) );
                mx[i][j]=max( mx[i][j], min( mx[i][k], mx[k][j] ) );
            }
        }
    }

    for( int i=1 ; i<n ; i++ ){
        for( int j=0 ; j<i ; j++ ){
            if( mn[i][j]!=a[i][j] || mx[i][j]!=b[i][j] ){
                cout << "NO\n";
                return 0;
            }
        }
    }
    cout << e.size() << '\n';
    for( auto u : e ){
        int x, y, z;
        tie( x, y, z )=u;
        cout << x << ' ' << y << ' ' << z <<'\n';
    }

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...