제출 #525983

#제출 시각아이디문제언어결과실행 시간메모리
525983model_codeParkovi (COCI22_parkovi)C++17
110 / 110
1318 ms32316 KiB
#include <bits/stdc++.h>

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)
#define ll long long
#define X first
#define Y second

using namespace std;

const int MAXN = 201000;

vector <pair <int, int> > ve[MAXN];
ll mid;
int uk;
bool flag[MAXN];
int marked[MAXN];

ll dfs(int x, int par) {
    if (ve[x].size() == 1 && x != 0) return 0;

    ll mi = (1LL << 60), ma = -(1LL << 60);
    for (auto tr : ve[x]) {
        int y = tr.X;
        ll d = tr.Y;
        if (y == par) continue;

        ll a = dfs(y, x);
        if (a == 0 && flag[y] == 1) {
            mi = min(mi, 0LL);
            ma = max(ma, 0LL);
            continue;
        }

        if (a < 0 && a + d <= 0) flag[x] = 1;

        if (a < 0 && a + d > 0) a = 0;
        else a += d;

        if (a > mid) {
            uk++;
            marked[y] = 1;
            //cout << y << " ";
            a = min(-mid + d, 0LL);
            if (-mid + d <= 0) flag[x] = 1;
            flag[y] = 1;
            //cout << y + 1 << endl;
        }

        //cout << x + 1 << " " << y + 1 << " " << a << endl;

        ma = max(ma, a);
        mi = min(mi, a);
    }
    //cout << x + 1 << ": " << mi << " " << ma << endl;
    if (-mi >= ma/* && mi != 0*/) {
        //flag[x] = 1;
        return mi;
    }
    return ma;
}

int main() {
    ios_base::sync_with_stdio(false);

    int n, k;
    cin >> n >> k;
    REP(i, n - 1) {
        int a, b, c;
        cin >> a >> b >> c;
        a--, b--;
        ve[a].push_back({b, c});
        ve[b].push_back({a, c});
    }

    ll lo = 0, hi = (1LL << 60);
    while (lo < hi) {
        mid = (lo + hi) / 2;
        uk = 0;
        memset(flag, 0, sizeof flag);
        memset(marked, 0, sizeof marked);
        if (dfs(0, 0) > 0) marked[0] = 1, uk++;
        else if (flag[0] == 0) marked[0] = 1, uk++;

        //cout << endl << uk << endl;
        //cout << mid << " " << uk << endl;

        if (uk <= k) hi = mid;
        else         lo = mid + 1;
    }

    mid = lo;
    uk = 0;
    memset(flag, 0, sizeof flag);
    memset(marked, 0, sizeof marked);
    if (dfs(0, 0) > 0) marked[0] = 1, uk++;
    else if (flag[0] == 0) marked[0] = 1, uk++;

    cout << lo << "\n";
    vector <int> out;
    REP(i, n) if (marked[i] == 1) out.push_back(i + 1);
    REP(i, n) if (out.size() < k && marked[i] == 0) out.push_back(i + 1);
    for (int x : out) cout << x << " "; cout << "\n";

    return 0;
}

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

Main.cpp: In function 'int main()':
Main.cpp:102:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  102 |     REP(i, n) if (out.size() < k && marked[i] == 0) out.push_back(i + 1);
      |                   ~~~~~~~~~~~^~~
Main.cpp:103:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  103 |     for (int x : out) cout << x << " "; cout << "\n";
      |     ^~~
Main.cpp:103:41: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  103 |     for (int x : out) cout << x << " "; cout << "\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...