답안 #1061674

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1061674 2024-08-16T11:42:08 Z n1k 봉쇄 시간 (IOI23_closing) C++17
43 / 100
88 ms 36664 KB
    #include "closing.h"
    #include <bits/stdc++.h>
     
    using namespace std;
     
    using ll = long long;
     
    int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W){
        vector<vector<array<int, 2>>> g(N);
        vector c(2, vector<ll>(N));
       vector<int> par(N);

    for(int i=0; i<N-1; i++){
        g[U[i]].push_back({V[i], W[i]});
        g[V[i]].push_back({U[i], W[i]});
    }
    function<void(int, int, vector<ll>&)> dfs = [&](int u, int p, vector<ll> &c){
        par[u] = p;
        for(auto [v, cost]:g[u]){
            if(v==p){
                continue;
            }
            c[v]+=c[u] + cost;
            dfs(v, u, c);
        }
    };

    dfs(X, -1, c[0]);
    dfs(Y, -1, c[1]);

    auto get = [&](ll K){
        int ans = 0;
        vector vis(2, vector<int>(N));
        priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> pq;
        // (cost, node, start x or y)
        pq.push({0, X, 0});
        pq.push({0, Y, 1});
        while(pq.size()){
            auto [cost, u, start] = pq.top();
            pq.pop();
            if(vis[start][u]){
                continue;
            }
            vis[start][u]=1;
            if(K<cost){
                break;
            }
            //cerr << u << " " << cost << " " << start << endl;
            ans++;
            K-=cost;
            for(auto [v, _]:g[u]){
                pq.push({c[start][v], v, start});
            }
        }
        return ans;
    };
    auto get2 = [&](ll K){
        int ans = 0;
        vector vis(2, vector<int>(N));
        priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> pq;
        priority_queue<array<ll, 2>, vector<array<ll, 2>>, greater<array<ll, 2>>> pq2;

        
        auto getnext = [&](auto u, auto start){
            array<ll, 3> best = {ll(1e9)};
            for(auto [v, _]:g[u]){
                if(vis[start^1][v] and c[start^1][v] <= c[start][v]){
                    if(not vis[start][v])
                        best = min(best, {c[start][v] - c[start^1][v], v, start});
                }else{
                    if(not vis[start][v])
                        best = min(best, {c[start][v], v, start});
                }
            }
            return best;
        };
        auto visite = [&](auto u, auto start, ll cost){
            assert(vis[start][u]==0);
            if(cost>K) return;
            vis[start][u]=1;
            cerr << u << " " << start << " " << cost << " " << K << endl;
            K -= cost;
            ans++;
            for(auto [v, _]:g[u]){
                if(vis[start^1][v] and c[start^1][v] <= c[start][v]){
                    pq.push({c[start][v] - c[start^1][v], v, start});
                }else{
                    pq.push({c[start][v], v, start});
                }
                if(vis[start^1][v] and c[start^1][u] >= c[start][u]){
                    pq.push({c[start^1][u] - c[start][u], u, start^1});
                }
                if(vis[start^1][u]){
                    pq2.push({max(c[0][v], c[1][v]), v});
                }
            }
        };
        for(int u=X; ; u=par[u]){
            if(min(c[0][u], c[1][u])>K){
                return ans;
            }
            if(c[0][u]<c[1][u]){
                visite(u, 0, c[0][u]);
            }else{
                visite(u, 1, c[1][u]);
            }
            if(u==Y) break;
        }
        while(pq.size() or pq2.size()){
            vector<array<ll, 3>> todo;
            array<ll, 2> cur = {-1, -1};
            while(pq.size() and todo.size()<2){
                auto [cost, u, start] = pq.top();
                pq.pop();
                if(vis[start][u]){
                    continue;
                }
                todo.push_back({cost, u, start});
            }
            while(pq2.size() and cur[0]==-1){
                auto [cost, u]=pq2.top();
                pq2.pop();
                if(vis[0][u] or vis[1][u]) continue;
                cur = {cost, u};
            }
            // todo.size() == 1
            // todo.size() == 0
            // todo.size() == 2
            if(todo.size()==0 and cur[0]!=-1 and K>=cur[0]){
                visite(cur[1], 0, cur[0]);
                visite(cur[1], 1, 0);
            }if(todo.size()==1){
                if(cur[0]==-1){
                    visite(todo[0][1], todo[0][2], todo[0][0]);
                }else{
                    auto v = getnext(todo[0][1], todo[0][2]);
                    if(todo[0][0] + v[0] < cur[0] or cur[0]>K){
                        visite(todo[0][1], todo[0][2], todo[0][0]);
                        pq2.push(cur);
                    }else if(cur[0]<=K){
                        visite(cur[1], 0, cur[0]);
                        visite(cur[1], 1, 0);
                        pq.push(todo[0]);
                    }
                }
            }if(todo.size()==2){
                if(cur[0]==-1){
                    visite(todo[0][1], todo[0][2], todo[0][0]);
                    pq.push(todo[1]);
                }else{
                    auto v = getnext(todo[0][1], todo[0][2]);
                    if(todo[0][0] + min(v[0], todo[1][0]) < cur[0] or cur[0]>K){
                        visite(todo[0][1], todo[0][2], todo[0][0]);
                        pq.push(todo[1]);
                        pq2.push(cur);
                    }else if(cur[0]<=K){
                        visite(cur[1], 0, cur[0]);
                        visite(cur[1], 1, 0);
                        pq.push(todo[0]);
                        pq.push(todo[1]);
                    }
                }
            }
        }
        return ans;
    };
    return max(get(K), get2(K));
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 88 ms 31268 KB Output is correct
2 Correct 88 ms 36664 KB Output is correct
3 Correct 80 ms 2912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 2 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 2 ms 344 KB Output is correct
15 Correct 0 ms 436 KB Output is correct
16 Correct 1 ms 348 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 10 ms 344 KB Output is correct
19 Correct 7 ms 348 KB Output is correct
20 Correct 1 ms 444 KB Output is correct
21 Correct 8 ms 348 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 3 ms 348 KB Output is correct
24 Correct 3 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 2 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 2 ms 344 KB Output is correct
15 Correct 0 ms 436 KB Output is correct
16 Correct 1 ms 348 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 10 ms 344 KB Output is correct
19 Correct 7 ms 348 KB Output is correct
20 Correct 1 ms 444 KB Output is correct
21 Correct 8 ms 348 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 3 ms 348 KB Output is correct
24 Correct 3 ms 344 KB Output is correct
25 Correct 37 ms 596 KB Output is correct
26 Correct 47 ms 1112 KB Output is correct
27 Correct 2 ms 860 KB Output is correct
28 Correct 46 ms 1368 KB Output is correct
29 Correct 46 ms 1112 KB Output is correct
30 Correct 2 ms 860 KB Output is correct
31 Correct 20 ms 1116 KB Output is correct
32 Correct 18 ms 1112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 1 ms 348 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 600 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Correct 1 ms 348 KB Output is correct
21 Incorrect 1 ms 348 KB 1st lines differ - on the 1st token, expected: '26', found: '25'
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 2 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 2 ms 344 KB Output is correct
16 Correct 0 ms 436 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Correct 0 ms 348 KB Output is correct
21 Correct 0 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 0 ms 348 KB Output is correct
25 Correct 1 ms 344 KB Output is correct
26 Correct 1 ms 348 KB Output is correct
27 Correct 0 ms 348 KB Output is correct
28 Correct 1 ms 348 KB Output is correct
29 Correct 0 ms 348 KB Output is correct
30 Correct 0 ms 600 KB Output is correct
31 Correct 1 ms 348 KB Output is correct
32 Correct 1 ms 348 KB Output is correct
33 Incorrect 1 ms 348 KB 1st lines differ - on the 1st token, expected: '26', found: '25'
34 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 2 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 2 ms 344 KB Output is correct
16 Correct 0 ms 436 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 10 ms 344 KB Output is correct
20 Correct 7 ms 348 KB Output is correct
21 Correct 1 ms 444 KB Output is correct
22 Correct 8 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 3 ms 348 KB Output is correct
25 Correct 3 ms 344 KB Output is correct
26 Correct 1 ms 348 KB Output is correct
27 Correct 0 ms 348 KB Output is correct
28 Correct 0 ms 348 KB Output is correct
29 Correct 0 ms 348 KB Output is correct
30 Correct 1 ms 348 KB Output is correct
31 Correct 0 ms 348 KB Output is correct
32 Correct 1 ms 344 KB Output is correct
33 Correct 1 ms 348 KB Output is correct
34 Correct 0 ms 348 KB Output is correct
35 Correct 1 ms 348 KB Output is correct
36 Correct 0 ms 348 KB Output is correct
37 Correct 0 ms 600 KB Output is correct
38 Correct 1 ms 348 KB Output is correct
39 Correct 1 ms 348 KB Output is correct
40 Incorrect 1 ms 348 KB 1st lines differ - on the 1st token, expected: '26', found: '25'
41 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 2 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 2 ms 344 KB Output is correct
16 Correct 0 ms 436 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 10 ms 344 KB Output is correct
20 Correct 7 ms 348 KB Output is correct
21 Correct 1 ms 444 KB Output is correct
22 Correct 8 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 3 ms 348 KB Output is correct
25 Correct 3 ms 344 KB Output is correct
26 Correct 37 ms 596 KB Output is correct
27 Correct 47 ms 1112 KB Output is correct
28 Correct 2 ms 860 KB Output is correct
29 Correct 46 ms 1368 KB Output is correct
30 Correct 46 ms 1112 KB Output is correct
31 Correct 2 ms 860 KB Output is correct
32 Correct 20 ms 1116 KB Output is correct
33 Correct 18 ms 1112 KB Output is correct
34 Correct 1 ms 348 KB Output is correct
35 Correct 0 ms 348 KB Output is correct
36 Correct 0 ms 348 KB Output is correct
37 Correct 0 ms 348 KB Output is correct
38 Correct 1 ms 348 KB Output is correct
39 Correct 0 ms 348 KB Output is correct
40 Correct 1 ms 344 KB Output is correct
41 Correct 1 ms 348 KB Output is correct
42 Correct 0 ms 348 KB Output is correct
43 Correct 1 ms 348 KB Output is correct
44 Correct 0 ms 348 KB Output is correct
45 Correct 0 ms 600 KB Output is correct
46 Correct 1 ms 348 KB Output is correct
47 Correct 1 ms 348 KB Output is correct
48 Incorrect 1 ms 348 KB 1st lines differ - on the 1st token, expected: '26', found: '25'
49 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 2 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 2 ms 344 KB Output is correct
16 Correct 0 ms 436 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 10 ms 344 KB Output is correct
20 Correct 7 ms 348 KB Output is correct
21 Correct 1 ms 444 KB Output is correct
22 Correct 8 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 3 ms 348 KB Output is correct
25 Correct 3 ms 344 KB Output is correct
26 Correct 37 ms 596 KB Output is correct
27 Correct 47 ms 1112 KB Output is correct
28 Correct 2 ms 860 KB Output is correct
29 Correct 46 ms 1368 KB Output is correct
30 Correct 46 ms 1112 KB Output is correct
31 Correct 2 ms 860 KB Output is correct
32 Correct 20 ms 1116 KB Output is correct
33 Correct 18 ms 1112 KB Output is correct
34 Correct 1 ms 348 KB Output is correct
35 Correct 0 ms 348 KB Output is correct
36 Correct 0 ms 348 KB Output is correct
37 Correct 0 ms 348 KB Output is correct
38 Correct 1 ms 348 KB Output is correct
39 Correct 0 ms 348 KB Output is correct
40 Correct 1 ms 344 KB Output is correct
41 Correct 1 ms 348 KB Output is correct
42 Correct 0 ms 348 KB Output is correct
43 Correct 1 ms 348 KB Output is correct
44 Correct 0 ms 348 KB Output is correct
45 Correct 0 ms 600 KB Output is correct
46 Correct 1 ms 348 KB Output is correct
47 Correct 1 ms 348 KB Output is correct
48 Incorrect 1 ms 348 KB 1st lines differ - on the 1st token, expected: '26', found: '25'
49 Halted 0 ms 0 KB -