Submission #1353819

#TimeUsernameProblemLanguageResultExecution timeMemory
1353819sallyBikes vs Cars (EGOI23_bikesvscars)C++20
100 / 100
196 ms7468 KiB
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
const int mx = 505;
#define INF 1000000000
int N, W, M=0;
int A[mx][mx], B[mx][mx];
vector<vector<pii>> gA(mx), gB(mx);
vector<pair<pii,int>> ans;
int fmx[mx][mx];
int fmn[mx][mx];
vector<pair<int ,pii>> pqA, pqB;
vector<int> p;
int find(int x) {
    if(p[x]<0) return x;
    return p[x] = find(p[x]);
}
bool uni(int a, int b) {
    a = find(a);
    b = find(b);
    if(a == b) return false;
    if(p[a] > p[b]) swap(a, b);
    p[a] += p[b];
    p[b] = a;
    return true;
}
void MST(vector<pair<int,pii>>& pq) {
    p.assign(mx, -1);
    int cnt = 0;
    for(auto [w, p]: pq) {
        auto [x, y] = p;
        if(uni(x, y)) {
            cnt++;
            ans.push_back({p, w});
        }
        if(cnt >= N-1) return;
    }
}
int main() {
    cin>>N>>W;
    for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) {
            if(i == j) {
                fmn[i][j] = 0;
                fmx[i][j] = INF;
            }
            else {
                fmn[i][j] = INF;
                fmx[i][j] = 0;
            }
        }
    }
    for(int j=1; j<N; j++)
        for(int i=0; i<j; i++) {
            int k;
            cin>>k;
            A[i][j] = W-k;
        }
    for(int j=1; j<N; j++)
        for(int i=0; i<j; i++) {
            cin>>B[i][j];
            if(B[i][j] >= A[i][j]) {
                // fmx[i][j] = fmx[j][i] = max(A[i][j], B[i][j]);
                // fmn[i][j] = fmn[j][i] = min(A[i][j], B[i][j]);
                // ans.push_back({{i, j}, A[i][j]});
                // ans.push_back({{i, j}, B[i][j]});
                // gA[i].push_back({j, A[i][j]});
                // gA[j].push_back({i, A[i][j]});
                // gB[i].push_back({j, B[i][j]});
                // gB[j].push_back({i, B[i][j]});
                pqA.push_back({A[i][j], {i, j}});
                pqB.push_back({B[i][j], {i, j}});
            }
        }
    sort(pqA.begin(), pqA.end());
    MST(pqA);
    sort(pqB.rbegin(), pqB.rend());
    MST(pqB);
    // check
    for(auto [p, w]:ans) {
        auto [i, j] = p;
        fmx[i][j] = fmx[j][i] = max(fmx[i][j], w);
        fmn[i][j] = fmn[j][i] = min(fmn[i][j], w);
    }
    for(int k=0; k<N; k++) {
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                fmx[i][j] = max(fmx[i][j], min(fmx[i][k], fmx[k][j]));
                fmn[i][j] = min(fmn[i][j], max(fmn[i][k], fmn[k][j]));
            }
        }
    }
    for(int j=1; j<N; j++) {
        for(int i=0; i<j; i++) {
            if(fmx[i][j] != B[i][j]) {cout<<"NO"; return 0;}
            if(fmn[i][j] != A[i][j]) {cout<<"NO"; return 0;}    
        }
    }
    cout<<ans.size()<<'\n';
    for(auto [p, w]:ans) {
        cout<<p.first<<' '<<p.second<<' '<<w<<'\n';
    }
}
#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...