제출 #918325

#제출 시각아이디문제언어결과실행 시간메모리
918325406Designated Cities (JOI19_designated_cities)C++17
100 / 100
312 ms62488 KiB
#include <bits/stdc++.h>
#define int int64_t
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)

using namespace std;
using ar = array<int, 2>;

const int64_t INF = 1ll << 60;
const int N = 2e5 + 5;

vector<ar> adj[N];
int dp, mx[N], up[N], ans[N], n, q;

void dfs_dp(int v, int p) {
        for (auto [u, w]: adj[v]) {
                dp += (u == p ? w : 0);
        }
        for (auto [u, w]: adj[v]) if (u != p) {
                mx[u] = mx[v] + w;
                dfs_dp(u, v);
        }
}

void dfs_up(int v, int p) {
        for (auto [u, w]: adj[v]) up[v] -= (u == p ? w : 0);

        for (auto [u, w]: adj[v]) if (u != p) {
                up[u] = up[v] + w;
                dfs_up(u, v);
        }
}

vector<int> V;
int dfs(int v, int p) {
        if (adj[v].size() == 1 && v != p) return 0;
        vector<int> ch;
        for (auto [u, w]: adj[v]) if (u != p) {
                int x = dfs(u, v);
                ch.push_back(x + w);
        }
        sort(ch.begin(), ch.end());
        int u = ch.back();
        ch.pop_back();
        V.insert(V.end(), ch.begin(), ch.end());
        return u;
}


signed main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr); 
        int sum = 0;
        cin >> n;
        FOR(i, 1, n) {
                int u, v, c, d;
                cin >> u >> v >> c >> d;
                --u, --v;
                adj[u].push_back({v, c});
                adj[v].push_back({u, d});
                sum += c + d;
        }

        dfs_dp(0, 0);

        up[0] = dp;
        dfs_up(0, 0);
        int rt = max_element(mx, mx + n) - mx;
        ans[1] = *max_element(up, up + n);

        V.push_back(dfs(rt, rt));
        sort(V.rbegin(), V.rend());
        int kbig = 0;
        FOR(i, 2, n + 1) {
                kbig += (i - 2 < V.size() ? V[i - 2] : 0);
                ans[i] = up[rt] + kbig;
        }
                        

        cin >> q;
        FOR(i, 0, q) {
                int x;
                cin >> x;
                cout << sum - ans[x] << '\n';
        }
        return 0;
}

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

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:74:32: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |                 kbig += (i - 2 < V.size() ? V[i - 2] : 0);
      |                          ~~~~~~^~~~~~~~~~
#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...