제출 #1337370

#제출 시각아이디문제언어결과실행 시간메모리
1337370neptunnsDžumbus (COCI19_dzumbus)C++20
0 / 110
18 ms1112 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define maxn 1005
#define mi LLONG_MIN
#define ma LLONG_MAX
#define mod 1000000007
#define pb push_back
#define S second
#define F first
vector<int> p(maxn), sz(maxn);
int get(int x) { return (p[x] == x ? p[x] : p[x] = get(p[x])); }
bool merge(int x, int y) {
    x = get(x);
    y = get(y);
    if (x == y) return 0;
    if (sz[x] < sz[y]) swap(x, y);
    sz[x] += sz[y];
    p[y] = x;
    return 1;
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        p[i] = i;
        sz[i] = 1;
    }

    priority_queue<pair<int, pair<int, int>>> g;
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        u--;
        v--;
        g.push({-(a[v] + a[u]), {u, v}});
    }
    vector<int> sums, ans;
    int sum = 0;
    int cnt = 0;
    sums.pb(sum);
    ans.pb(cnt);
    vector<int> act(n, 0);
    while (!g.empty()) {
        int w = -g.top().F, u = g.top().S.F, v = g.top().S.S;
        g.pop();
        int ac = (act[u] == 0 ? a[u] : 0) + (act[v] == 0 ? a[v] : 0);
        if (w != ac) {
            g.push({-ac, {u, v}});
            continue;
        }
        if (merge(u, v)) {
            sum += (act[u] == 0 ? a[u] : 0) + (act[v] == 0 ? a[v] : 0);
            cnt += (act[u] == 0) + (act[v] == 0);
            sums.pb(sum);
            ans.pb(cnt);
            act[u] = 1;
            act[v] = 1;
        }
    }
    int q;
    cin >> q;

    while (q--) {
        int x;
        cin >> x;
        int idx = upper_bound(sums.begin(), sums.end(), x) - sums.begin() - 1;
        if (idx < 0) idx = 0;
        cout << ans[idx] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...