답안 #991817

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
991817 2024-06-03T08:01:16 Z stdfloat 봉쇄 시간 (IOI23_closing) C++17
21 / 100
1000 ms 25172 KB
#include <bits/stdc++.h>
#include "closing.h"
using namespace std;

#define ff  first
#define ss  second
#define pii pair<int, int>

using ll = long long;

vector<ll> c;

vector<vector<pii>> E;

bool dfs(int x, int p, ll sm, int t) {
    if (x == t) {
        c[x] = max(c[x], sm);
        return true;
    }

    for (auto [i, w] : E[x]) {
        if (i == p) continue;

        if (dfs(i, x, sm + w, t)) {
            c[x] = max(c[x], sm);
            return true;
        }
    }

    return false;
}

int max_score(int n, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) {
    E.assign(n, {});
    for (int i = 0; i < n - 1; i++) {
        E[U[i]].push_back({V[i], W[i]});
        E[V[i]].push_back({U[i], W[i]});
    }

    auto f = [&](int st) -> vector<ll> {
        queue<int> q;
        vector<ll> dis(n, -1);
        q.push(st); dis[st] = 0;
        while (!q.empty()) {
            auto x = q.front(); q.pop();

            for (auto [i, w] : E[x]) {
                if (dis[i] == -1) {
                    dis[i] = dis[x] + w;
                    q.push(i);
                }
            }
        }

        return dis;
    };

    vector<ll> disx = f(X), disy = f(Y);

    if (n < 17) {
        int mx = 0;

        for (int mk = 0; mk < (1 << n); mk++) {
            c.assign(n, -1);
            for (int i = 0; i < n; i++) {
                if (!((mk >> i) & 1)) continue;
                dfs(X, -1, 0, i); dfs(Y, -1, 0, i);
            }

            ll sm = 0;
            for (auto i : c)
                if (i != -1) sm += i;

            if (sm > K) continue;

            vector<int> u;
            for (int i = 0; i < n; i++) {
                if (c[i] == -1) u.push_back(min(disx[i], disy[i]));
            }

            sort(u.begin(), u.end());

            int cnt = 0;
            for (int i = 0; i < n; i++) {
                if (c[i] != -1) cnt += 1 + (c[i] != min(disx[i], disy[i]));
            }
            int z = cnt;

            for (auto i : u) {
                if (sm + i <= K) {
                    sm += i;
                    cnt++;
                }
                else break;
            }

            mx = max(mx, cnt);

            if (cnt == 6) {
                cout << z << "\n";
                for (int j = 0; j < n; j++)
                    cout << ((mk >> j) & 1) << ' ';
                cout << endl;
                for (auto i : c)
                    cout << i << ' ';
                cout << endl;
            }
        }

        return mx;
    }

    vector<pii> v;
    for (int i = 0; i < n; i++) {
        if ((int)E[i].size() == 1) {
            v.push_back({i, 0});
            
            queue<int> q;
            vector<bool> vis(n);
            q.push(i); vis[i] = true;
            while (!q.empty()) {
                auto x = q.front(); q.pop();

                for (auto [j, w] : E[x]) {
                    if (!vis[j]) {
                        q.push(j);
                        vis[j] = true;
                        v.push_back({j, w});
                    }
                }
            }
        
            break;
        }
    }

    for (auto [i, w] : v) {
        if (i == X || i == Y) {
            if (i == Y) swap(X, Y);
            break;
        }
    }

    int a = -1, b = -1;
    for (int i = 0; i < (int)v.size(); i++) {
        if (v[i].ff == X) a = i;
        else if (v[i].ff == Y) b = i;
    }

    vector<int> u;
    for (int k = 0; k < n; k++) {
        u.push_back(min(disx[v[k].ff], disy[v[k].ff]));
    }

    sort(u.begin(), u.end());

    ll sm = 0;
    int cnt = 0;
    for (auto i : u) {
        if (sm + i <= K) {
            sm += i;
            cnt++;
        }
        else break;
    }

    int mx = cnt;
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            vector<ll> c(n, -1);
            for (auto x : {a, b}) {
                for (auto y : {i, j}) {
                    ll sm = 0;
                    c[x] = max(c[x], 0LL);
                    if (y <= x) {
                        for (int k = x - 1; k >= y; k--)
                            c[k] = max(c[k], sm += v[k + 1].ss);
                    }
                    else {
                        for (int k = x + 1; k <= y; k++)
                            c[k] = max(c[k], sm += v[k].ss);
                    }
                }
            }

            ll sm = 0;
            for (auto k : c)
                if (k != -1) sm += k;

            if (sm > K) break;

            vector<int> u;
            for (int k = 0; k < n; k++) {
                if (c[k] == -1) u.push_back(min(disx[v[k].ff], disy[v[k].ff]));
            }

            sort(u.begin(), u.end());

            int cnt = 0;
            for (int i = 0; i < n; i++) {
                if (c[i] != -1) cnt += 1 + (c[i] != min(disx[i], disy[i]));
            }

            for (auto i : u) {
                if (sm + i <= K) {
                    sm += i;
                    cnt++;
                }
                else break;
            }

            mx = max(mx, cnt);
        }
    }

    return mx;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Possible tampering with the output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1093 ms 25172 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 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 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 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 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 3 ms 344 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 3 ms 348 KB Output is correct
15 Correct 1 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 1 ms 348 KB Output is correct
19 Correct 403 ms 468 KB Output is correct
20 Correct 2 ms 348 KB Output is correct
21 Correct 345 ms 348 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 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 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 3 ms 344 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 3 ms 348 KB Output is correct
15 Correct 1 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 1 ms 348 KB Output is correct
19 Correct 403 ms 468 KB Output is correct
20 Correct 2 ms 348 KB Output is correct
21 Correct 345 ms 348 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 1 ms 348 KB Output is correct
25 Correct 26 ms 348 KB Output is correct
26 Execution timed out 1018 ms 600 KB Time limit exceeded
27 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Possible tampering with the output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Possible tampering with the output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Possible tampering with the output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Possible tampering with the output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Possible tampering with the output
2 Halted 0 ms 0 KB -