답안 #940324

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
940324 2024-03-07T08:00:22 Z Ghetto 봉쇄 시간 (IOI23_closing) C++17
8 / 100
97 ms 27340 KB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pil = pair<int, lint>;
using pli = pair<lint, int>;
const int MAX_N = 2e5 + 5;
const lint INF = 5e18;

int n, x, y;
lint k;
vector<pil> adj[MAX_N];

bool seen[MAX_N];
lint min_dist[MAX_N];
priority_queue<pli, vector<pli>, greater<pli>> order;
void dijk(int s) {
    for (int i = 0; i <= n - 1; i++) {
        min_dist[i] = INF;
        seen[i] = false;
    } 

    min_dist[s] = 0;
    order.push({0, s});

    while (order.size()) {
        int u = order.top().second;
        order.pop();

        if (seen[u]) continue;
        seen[u] = true;

        for (pil e : adj[u]) {
            lint new_dist = min_dist[u] + e.second;
            
            if (new_dist >= min_dist[e.first]) continue;
            min_dist[e.first] = new_dist;
            order.push({new_dist, e.first});
        }
    }
}

lint dist[MAX_N];
void precomp() {
    dijk(x);
    for (int i = 0; i <= n - 1; i++)
        if (min_dist[i] <= k) dist[i] = min_dist[i];
    dijk(y);
    for (int i = 0; i <= n - 1; i++)
        if (min_dist[i] <= k) dist[i] = min_dist[i];
}

bool taken[MAX_N];
set<pli> order2; // {dist, node}

void init() {
    for (int i = 0; i <= n - 1; i++) {
        adj[i].clear();
        dist[i] = INF;
        taken[i] = false;
    }
    order2.clear();
}
 
int max_score(int tmp_n, int tmp_x, int tmp_y, lint tmp_k, vector<int> edge1, vector<int> edge2, vector<int> edge3) {
    n = tmp_n;
    x = tmp_x;
    y = tmp_y;
    k = tmp_k;
    init();
    for (int i = 0; i <= n - 2; i++) {
        adj[edge1[i]].push_back({edge2[i], edge3[i]});
        adj[edge2[i]].push_back({edge1[i], edge3[i]});
    }
    precomp();

    order2.insert({0, x});
    order2.insert({0, y});
    lint sum = 0;

    while (order2.size()) {
        int u = order2.begin()->second;
        order2.erase(order2.begin());

        if (sum + dist[u] > k) break;
        taken[u] = true;
        sum += dist[u];

        for (pil e : adj[u]) {
            if (taken[e.first]) continue;
            if (order2.count({dist[e.first], e.first})) continue;

            order2.insert({dist[e.first], e.first});
        }
    }

    int ans = 0;
    for (int i = 0; i <= n - 1; i++) ans += taken[i];
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '6', found: '3'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 27220 KB Output is correct
2 Correct 97 ms 27340 KB Output is correct
3 Correct 64 ms 13648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '3', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '3', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '3', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '6', found: '3'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '6', found: '3'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '6', found: '3'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '6', found: '3'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 8284 KB 1st lines differ - on the 1st token, expected: '6', found: '3'
2 Halted 0 ms 0 KB -