제출 #1132719

#제출 시각아이디문제언어결과실행 시간메모리
1132719crafticatConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
241 ms40572 KiB
#include <bits/stdc++.h>

using namespace std;
#define F0R(i, n) for (ll i = 0; i < n;i++)
#define FOR(i,j, n) for (ll i = j; i < n;i++)

using ll = long long;
template<typename T>
using V = vector<T>;
using vi = V<ll>;
using pi = pair<ll,ll>;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template <class T>
using Tree =
        tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

constexpr ll INF = 1e18;

ll solve(const vi &d1,const vi &d2, ll n, ll k) {
    V<pair<pi, ll>> updates; // Y, X, type

    FOR(i, 1, n + 1) {
        updates.emplace_back(make_pair(d1[i], d2[i]), 1ll);
        updates.emplace_back(make_pair(k - d2[i] + 1, k - d1[i] + 1),0);
    }

    std::sort(updates.begin(), updates.end());
    std::reverse(updates.begin(), updates.end());
    Tree<pi> items;
    ll R = 0;
    ll ans = 0;

    for (auto [p, t] : updates) {
        if (t == 1) {
            items.insert({p.second,R++ });
        }
        if (t == 0) {
            ans += items.size() - items.order_of_key({p.second, -INF}) - 1; // Self
        }
    }

    ans /= 2;
    return n * (n - 1) / 2 - (ans);
}

vi dikstra(ll x, V<V<pi>> &g) {
    vi results(g.size(), INF);

    priority_queue<pi, V<pi>, greater<>> pq;

    pq.emplace(0, x);
    while (!pq.empty()) {
        auto [d, node] = pq.top(); pq.pop();
        if (results[node] != INF) continue;
        results[node] = d;

        for (auto [y, c] : g[node]) {
            if (results[y] != INF) continue;
            pq.emplace(c + d, y);
        }
    }

    return results;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);

    ll n, m; cin >> n >> m;
    ll a, b, t, k; cin >> a >> b >> t >> k;
    ll k2 = k;
    k -= t;
    V<V<pi>> g(n + 1);
    F0R(i, m) {
        ll x, y, z; cin >> x >> y >> z;
        g[x].emplace_back(y,z);
        g[y].emplace_back(x,z);
    }

    vi d1 = dikstra(a, g);
    vi d2 = dikstra(b, g);

    if (d1[b] <= k2) {
        cout << (n * (n - 1)) / 2;
        return 0;
    }

    cout << solve(d1, d2, n, k);

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...