제출 #1366059

#제출 시각아이디문제언어결과실행 시간메모리
1366059husseinjuanda벽 칠하기 (APIO20_paint)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

struct edge{
    int u, v, w;
};

struct info{
    int t;
    int vert;
    int ed;
    bool deg3;
};

int n, m;
vector<edge> e;
vector<vector<pair<int,int>>> parhist;
vector<vector<info>> inhist;
vector<int> deg;

int getpar(int x, int t){
    auto &v = parhist[x];

    int l = 0, r = (int)v.size() - 1;
    int ret = x;

    while(l <= r){
        int mid = (l + r) / 2;

        if(v[mid].first <= t){
            ret = v[mid].second;
            l = mid + 1;
        }
        else{
            r = mid - 1;
        }
    }

    return ret;
}

int fpar(int x, int t){
    int p = getpar(x, t);

    if(p == x) return x;
    return fpar(p, t);
}

info getinfo(int x, int t){
    auto &v = inhist[x];

    int l = 0, r = (int)v.size() - 1;
    info ret = v[0];

    while(l <= r){
        int mid = (l + r) / 2;

        if(v[mid].t <= t){
            ret = v[mid];
            l = mid + 1;
        }
        else{
            r = mid - 1;
        }
    }

    return ret;
}

bool good(int root, int t){
    info cur = getinfo(root, t);

    if(cur.ed >= cur.vert) return true;
    if(cur.deg3) return true;

    return false;
}

bool ok(int t, int x, int y){
    int rx = fpar(x, t);
    int ry = fpar(y, t);

    if(rx != ry) return false;

    return good(rx, t);
}

void init(int N, int M, vector<int> U, vector<int> V, vector<int> W){
    n = N;
    m = M;

    e.resize(m);

    for(int i = 0; i < m; i++){
        e[i] = {U[i], V[i], W[i]};
    }

    sort(e.begin(), e.end(), [](edge a, edge b){
        return a.w < b.w;
    });

    parhist.assign(n, {});
    inhist.assign(n, {});
    deg.assign(n, 0);

    for(int i = 0; i < n; i++){
        parhist[i].push_back({0, i});
        inhist[i].push_back({0, 1, 0, false});
    }

    for(int i = 1; i <= m; i++){
        int u = e[i - 1].u;
        int v = e[i - 1].v;

        bool adddeg3 = false;

        deg[u]++;
        if(deg[u] == 3) adddeg3 = true;

        deg[v]++;
        if(deg[v] == 3) adddeg3 = true;

        int ru = fpar(u, i - 1);
        int rv = fpar(v, i - 1);

        if(ru == rv){
            info cur = getinfo(ru, i - 1);

            cur.t = i;
            cur.ed++;
            cur.deg3 = cur.deg3 || adddeg3;

            inhist[ru].push_back(cur);
        }
        else{
            info a = getinfo(ru, i - 1);
            info b = getinfo(rv, i - 1);

            if(a.vert < b.vert){
                swap(ru, rv);
                swap(a, b);
            }

            parhist[rv].push_back({i, ru});

            info cur;
            cur.t = i;
            cur.vert = a.vert + b.vert;
            cur.ed = a.ed + b.ed + 1;
            cur.deg3 = a.deg3 || b.deg3 || adddeg3;

            inhist[ru].push_back(cur);
        }
    }
}

int getMinimumFuelCapacity(int x, int y){
    if(!ok(m, x, y)) return -1;

    int l = 1, r = m;
    int ans = m;

    while(l <= r){
        int mid = (l + r) / 2;

        if(ok(mid, x, y)){
            ans = mid;
            r = mid - 1;
        }
        else{
            l = mid + 1;
        }
    }

    return e[ans - 1].w;
}

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

    int N, M;
    cin >> N >> M;

    vector<int> U(M), V(M), W(M);

    for(int i = 0; i < M; i++){
        cin >> U[i] >> V[i] >> W[i];
    }

    init(N, M, U, V, W);

    int Q;
    cin >> Q;

    while(Q--){
        int X, Y;
        cin >> X >> Y;

        cout << getMinimumFuelCapacity(X, Y) << '\n';
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/cc1c8Odv.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccDXhVgf.o:paint.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/cc1c8Odv.o: in function `main':
grader.cpp:(.text.startup+0x278): undefined reference to `minimumInstructions(int, int, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)'
collect2: error: ld returned 1 exit status