Submission #1354671

#TimeUsernameProblemLanguageResultExecution timeMemory
1354671hsuan._.0528Bikes vs Cars (EGOI23_bikesvscars)C++20
100 / 100
381 ms15448 KiB
// pD
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<LL, LL>
#define S second
#define F first
const int maxn = 1000+10;

int n, w;
int b[maxn][maxn];
int c[maxn][maxn];
vector< tuple<int, int, int> > cc, bb;
vector< tuple<int, int, int> > v;
int parent[maxn];
int sc[maxn][maxn], sb[maxn][maxn];

void init(int n){
    for(int i=0; i<=n; i++){
        parent[i]=i;
    }
}


int leader(int x){
    if(parent[x]!=x)  return parent[x]=leader(parent[x]);
    return x;
}


bool merge(int x, int y){
    x=leader(x);
    y=leader(y);
    if(x==y)  return 0;
    parent[x]=y;
    return 1;
}


signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>w;
    for(int i=1; i<n; i++)
        for(int j=0; j<i; j++)  cin>>c[i][j];
    for(int i=1; i<n; i++)
        for(int j=0; j<i; j++)  cin>>b[i][j];

    for(int i=1; i<n; i++)
        for(int j=0; j<i; j++){
            if(b[i][j] + c[i][j] < w)  continue;
            bb.push_back( make_tuple(-b[i][j], i, j) );
            cc.push_back( make_tuple(-c[i][j], i, j) );
        }
    sort(cc.begin(), cc.end());
    sort(bb.begin(), bb.end());

    init(n);
    memset(sc, -1, sizeof(sc) );
    for(int i=0; i<cc.size(); i++){
        auto[val, x, y] = cc[i];
        if(merge(x, y)){
            sc[x][y]=sc[y][x]=-val;
            v.push_back( make_tuple(x, y, w-(-val)) );
        }
    }

    init(n);
    memset(sb, -1, sizeof(sc) );
    for(int i=0; i<bb.size(); i++){
        auto[val, x, y] = bb[i];
        if(merge(x, y)){
            sb[x][y]=sb[y][x]=-val;
            v.push_back( make_tuple(x, y, -val) );
        }
    }

    for(int k=0; k<n; k++)
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++){
                sc[i][j]=sc[j][i]=max(sc[i][j], min(sc[i][k], sc[k][j]));
                sb[i][j]=sb[j][i]=max(sb[i][j], min(sb[i][k], sb[k][j]));
            }

    for(int i=0; i<n; i++)
        for(int j=0; j<i; j++)
            if(sb[i][j] != b[i][j] or sc[i][j] != c[i][j]){
                cout<<"NO";
                return 0;
            }
    cout<<v.size()<<"\n";
    for(auto[x, y, val]: v)  cout<<x<<" "<<y<<" "<<val<<"\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...