Submission #479155

# Submission time Handle Problem Language Result Execution time Memory
479155 2021-10-10T08:57:22 Z Joshc Training (IOI07_training) C++11
91 / 100
300 ms 17876 KB
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define pii pair<int, int>
#define mp make_pair
#define f first
#define s second

vector<int> edges[1005], edges2[1005];
vector<pair<pii, vector<pii>>> paths[1005]; 
vector<pair<pii, int>> unpaved;
int parent[1005], depth[1005], parity[1005], ind[1005][1005], dp[1005][1024], precalc[5005]; 

void dfs(int v, int p, int d, int t) {
    parent[v] = p;
    depth[v] = d;
    parity[v] = t;
    for (int i : edges2[v]) {
        if (i != p) {
            dfs(i, v, d+1, 1^t);
            edges[v].push_back(i);
        }
    }
}

int ans(int v, int b) {
    if (dp[v][b] != -1) return dp[v][b];
    dp[v][b] = 0;
    for (int i : edges[v]) {
        if ((b&ind[v][i]) == 0) dp[v][b] += ans(i, 0);
    }
    for (auto path : paths[v]) {
        if (b&path.s.back().s) continue;
        if (precalc[path.f.s] == -1) {
            precalc[path.f.s] = path.f.f;
            for (int i=0; i+1<path.s.size(); i++) precalc[path.f.s] += ans(path.s[i].f, path.s[i].s);
        }
        dp[v][b] = max(dp[v][b], precalc[path.f.s]+ans(v, b^path.s.back().s));
    }
    return dp[v][b];
}

int main() {
    int n, m, a, b, c, total = 0, pathnum = 0;
    scanf("%d%d", &n, &m);
    while (m--) {
        scanf("%d%d%d", &a, &b, &c);
        total += c;
        if (c) unpaved.push_back({{a, b}, c});
        else {
            edges2[a].push_back(b);
            edges2[b].push_back(a);
        }
    }
    dfs(1, 0, 0, 0);
    for (int i=1; i<=n; i++) {
        for (int j=0; j<edges[i].size(); j++) ind[i][edges[i][j]] = 1<<j;
    }
    for (auto i : unpaved) {
        a = i.f.f, b = i.f.s, c = i.s;
        if (parity[a] != parity[b]) continue;
        if (depth[a] < depth[b]) swap(a, b);
        vector<pii> path = {{a, 0}};
        while (depth[a] != depth[b]) {
            path.emplace_back(parent[a], ind[parent[a]][a]);
            a = parent[a];
        }
        if (a != b) {
            path.emplace_back(b, 0);
            while (parent[a] != parent[b]) {
                path.emplace_back(parent[a], ind[parent[a]][a]);
                a = parent[a];
                path.emplace_back(parent[b], ind[parent[b]][b]);
                b = parent[b];
            }
            path.emplace_back(parent[a], ind[parent[a]][a]^ind[parent[a]][b]);
            a = parent[a];
        }
        paths[a].push_back({{c, pathnum++}, path});
    }
    fill(&dp[0][0], &dp[1004][0], -1);
    fill(&precalc[0], &precalc[5004], -1);
    printf("%d\n", total-ans(1, 0));
}

Compilation message

training.cpp: In function 'int ans(int, int)':
training.cpp:38:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |             for (int i=0; i+1<path.s.size(); i++) precalc[path.f.s] += ans(path.s[i].f, path.s[i].s);
      |                           ~~~^~~~~~~~~~~~~~
training.cpp: In function 'int main()':
training.cpp:59:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         for (int j=0; j<edges[i].size(); j++) ind[i][edges[i][j]] = 1<<j;
      |                       ~^~~~~~~~~~~~~~~~
training.cpp:47:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
training.cpp:49:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |         scanf("%d%d%d", &a, &b, &c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4428 KB Output is correct
2 Correct 2 ms 4428 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4556 KB Output is correct
2 Correct 2 ms 4556 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 10572 KB Output is correct
2 Correct 19 ms 10828 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4428 KB Output is correct
2 Correct 3 ms 4428 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4428 KB Output is correct
2 Correct 2 ms 4428 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4556 KB Output is correct
2 Correct 3 ms 4556 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4940 KB Output is correct
2 Correct 3 ms 4812 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 5260 KB Output is correct
2 Correct 6 ms 5196 KB Output is correct
3 Correct 54 ms 6148 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 7104 KB Output is correct
2 Correct 37 ms 5748 KB Output is correct
3 Correct 9 ms 6200 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 21 ms 4956 KB Output is correct
2 Correct 9 ms 6604 KB Output is correct
3 Execution timed out 525 ms 17876 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 20 ms 9592 KB Output is correct
2 Correct 236 ms 17340 KB Output is correct
3 Correct 23 ms 9436 KB Output is correct
4 Correct 30 ms 6144 KB Output is correct