답안 #102506

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
102506 2019-03-25T12:30:53 Z alexpetrescu Designated Cities (JOI19_designated_cities) C++14
33 / 100
744 ms 39052 KB
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstdlib>

//FILE *fin = fopen("a.in", "r"), *fout = fopen("a.out", "w");
#define fin stdin
#define fout stdout

#define ll long long

#define MAXN 200009

struct myc {
    int x, y, z;
};
std::vector < int > candidat[MAXN];
std::vector < myc > g[MAXN];
ll ans[MAXN], sumaTuturor;
int e[MAXN], desteptu[MAXN], istetu[MAXN];
bool viz[MAXN], luat[MAXN], seen[MAXN];
ll sum[MAXN], calc[MAXN], h[MAXN], cost[MAXN];
int t[MAXN], cine[MAXN], perm[MAXN];
int A, B, C;

void dfs1(int x) {
    viz[x] = 1;
    for (auto &y : g[x]) {
        if (viz[y.x] == 0) {
            dfs1(y.x);
            sum[x] += sum[y.x] + y.z;
        }
    }
}

void dfs2(int x, ll dinSpate) {
    viz[x] = 1;
    calc[x] = sum[x] + dinSpate;
    ans[1] = std::min(ans[1], sumaTuturor - calc[x]);
    desteptu[x] = x;
    for (auto &y : g[x]) {
        if (viz[y.x] == 0) {
            h[y.x] = h[x] + y.y;
            dfs2(y.x, dinSpate + sum[x] - sum[y.x] - y.z + y.y);
            if (h[desteptu[y.x]] > h[desteptu[x]]) {
                istetu[x] = desteptu[x];
                desteptu[x] = desteptu[y.x];
            } else if (h[desteptu[y.x]] > h[istetu[x]])
                istetu[x] = desteptu[y.x];
        }
    }
    if (h[desteptu[x]] + h[istetu[x]] - h[x] + calc[x] > h[A] + h[B] - h[C] + calc[C])
        A = desteptu[x], B = istetu[x], C = x;
}

void dfs3(int x) {
    viz[x] = 1;
    bool frunza = 1;
    desteptu[x] = x;
    for (auto &y : g[x]) {
        if (viz[y.x] == 0) {
            frunza = 0;
            h[y.x] = h[x] + y.y;
            t[y.x] = x;
            dfs3(y.x);
            if (h[desteptu[y.x]] > h[desteptu[x]])
                desteptu[x] = desteptu[y.x];
            luat[x] |= luat[y.x];
            if (luat[y.x] == 0)
                ans[2] += y.y;
        }
    }
    if(frunza)
        e[++e[0]] = x;
}

bool cmp(const int &a, const int &b) {
    return cost[a] > cost[b];
}

void dfs4(int x) {
    viz[x] = 1;
    for (auto &y : g[x]) {
        if (viz[y.x] == 0) {
            if (luat[y.x] == 0 && seen[desteptu[y.x]] == 0) {
                seen[desteptu[y.x]] = 1;
                cost[desteptu[y.x]] = h[desteptu[y.x]] - h[x];
                candidat[x].push_back(desteptu[y.x]);
            }
            dfs4(y.x);
        }
    }
    std::sort(candidat[x].begin(), candidat[x].end(), cmp);
}

inline void solve(int n) {
    int rad = 0;
    for (int i = 1; i <= n; i++)
        if ((int)g[i].size() != 1)
            rad = i;
    ans[1] = sumaTuturor;
    dfs1(rad);
    for (int i = 1; i <= n; i++)
        viz[i] = 0;
    h[0] = cost[0] = -1000000000000000000LL;
    dfs2(rad, 0);
    for (int i = 1; i <= n; i++)
        viz[i] = 0;
    luat[A] = luat[B] = 1;
    h[C] = 0;
    dfs3(C);
    for (int i = 1; i <= n; i++)
        viz[i] = 0;
    dfs4(C);

    for (int i = 1; i <= n; i++)
        for (auto &x : g[i])
            if (luat[x.x] == 0 && t[x.x] == i)
                cost[x.x] = h[desteptu[x.x]] - h[i], cine[x.x] = desteptu[x.x];

    for (int i = 1; i <= n; i++)
        perm[i] = i;
    std::sort(perm + 1, perm + n + 1, cmp);

    int poz = 1;
    for (int i = 3; i <= e[0]; i++) {
        while (luat[cine[perm[poz]]])
            poz++;
        ans[i] = ans[i - 1] - cost[perm[poz]];
        int best = cine[perm[poz]];
        while (luat[best] == 0) {
            luat[best] = 1;
            best = t[best];
        }
    }
}

int main() {
    int n;
    fscanf(fin, "%d", &n);

    for (int i = 1; i < n; i++) {
        int x, y, z, t;
        fscanf(fin, "%d%d%d%d", &x, &y, &z, &t);

        g[x].push_back({y, z, t});
        g[y].push_back({x, t, z});

        sumaTuturor += z + t;
        ans[1] = std::min(z, t);
    }

    if (n > 2)
        solve(n);

    int q;
    fscanf(fin, "%d", &q);

    for (; q; q--) {
        int x;
        fscanf(fin, "%d", &x);

        fprintf(fout, "%lld\n", ans[x]);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}

Compilation message

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:140:11: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf(fin, "%d", &n);
     ~~~~~~^~~~~~~~~~~~~~~
designated_cities.cpp:144:15: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf(fin, "%d%d%d%d", &x, &y, &z, &t);
         ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:157:11: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf(fin, "%d", &q);
     ~~~~~~^~~~~~~~~~~~~~~
designated_cities.cpp:161:15: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf(fin, "%d", &x);
         ~~~~~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9728 KB Output is correct
2 Correct 12 ms 9856 KB Output is correct
3 Correct 11 ms 9700 KB Output is correct
4 Correct 11 ms 9728 KB Output is correct
5 Correct 11 ms 9728 KB Output is correct
6 Correct 12 ms 9728 KB Output is correct
7 Incorrect 11 ms 9720 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9728 KB Output is correct
2 Correct 634 ms 31568 KB Output is correct
3 Correct 618 ms 32888 KB Output is correct
4 Correct 660 ms 31376 KB Output is correct
5 Correct 657 ms 31276 KB Output is correct
6 Correct 671 ms 33148 KB Output is correct
7 Correct 451 ms 31016 KB Output is correct
8 Correct 662 ms 37996 KB Output is correct
9 Correct 519 ms 31064 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 9728 KB Output is correct
2 Correct 695 ms 31596 KB Output is correct
3 Correct 614 ms 32476 KB Output is correct
4 Correct 696 ms 31480 KB Output is correct
5 Correct 573 ms 31264 KB Output is correct
6 Correct 630 ms 32932 KB Output is correct
7 Correct 512 ms 32940 KB Output is correct
8 Correct 614 ms 39052 KB Output is correct
9 Correct 530 ms 30980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9728 KB Output is correct
2 Correct 12 ms 9856 KB Output is correct
3 Correct 11 ms 9700 KB Output is correct
4 Correct 11 ms 9728 KB Output is correct
5 Correct 11 ms 9728 KB Output is correct
6 Correct 12 ms 9728 KB Output is correct
7 Incorrect 11 ms 9720 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9728 KB Output is correct
2 Correct 634 ms 31568 KB Output is correct
3 Correct 618 ms 32888 KB Output is correct
4 Correct 660 ms 31376 KB Output is correct
5 Correct 657 ms 31276 KB Output is correct
6 Correct 671 ms 33148 KB Output is correct
7 Correct 451 ms 31016 KB Output is correct
8 Correct 662 ms 37996 KB Output is correct
9 Correct 519 ms 31064 KB Output is correct
10 Correct 7 ms 9728 KB Output is correct
11 Correct 695 ms 31596 KB Output is correct
12 Correct 614 ms 32476 KB Output is correct
13 Correct 696 ms 31480 KB Output is correct
14 Correct 573 ms 31264 KB Output is correct
15 Correct 630 ms 32932 KB Output is correct
16 Correct 512 ms 32940 KB Output is correct
17 Correct 614 ms 39052 KB Output is correct
18 Correct 530 ms 30980 KB Output is correct
19 Correct 11 ms 9728 KB Output is correct
20 Correct 671 ms 31456 KB Output is correct
21 Correct 632 ms 33016 KB Output is correct
22 Correct 620 ms 31540 KB Output is correct
23 Correct 744 ms 31480 KB Output is correct
24 Correct 621 ms 31352 KB Output is correct
25 Correct 646 ms 31352 KB Output is correct
26 Correct 663 ms 31596 KB Output is correct
27 Correct 614 ms 31156 KB Output is correct
28 Correct 701 ms 33016 KB Output is correct
29 Correct 617 ms 30888 KB Output is correct
30 Correct 598 ms 31700 KB Output is correct
31 Correct 572 ms 31272 KB Output is correct
32 Correct 657 ms 38176 KB Output is correct
33 Correct 563 ms 31008 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9728 KB Output is correct
2 Correct 12 ms 9856 KB Output is correct
3 Correct 11 ms 9700 KB Output is correct
4 Correct 11 ms 9728 KB Output is correct
5 Correct 11 ms 9728 KB Output is correct
6 Correct 12 ms 9728 KB Output is correct
7 Incorrect 11 ms 9720 KB Output isn't correct
8 Halted 0 ms 0 KB -