Submission #1322905

#TimeUsernameProblemLanguageResultExecution timeMemory
1322905cubedConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
250 ms22152 KiB
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define f first
// #define s second
#define pb(x) push_back(x)
#define int long long


/*
ORDERED SET PDBS

#include <bits/extc++.h>
using namespace __gnu_pbds;

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
*/

const int MOD = 1e9+7;
const int inf = 1e9;
const int INF = 1e18+20;
const int LOG = 25;

void solve() {
    int n, m;
    cin>>n>>m;

    int s, t, l, k;
    cin>>s>>t>>l>>k;
    s--; t--;

    vector<vector<pair<int, int>>> adj(n);
    for (int i=0; i<m; i++) {
        int u, v, w;
        cin>>u>>v>>w;
        u--; v--;

        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }

    vector<int> d1(n, INF);
    d1[s]=0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, s});

    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d1[u]!=d) continue;

        for (auto [v, w] : adj[u]) {
            if (d1[v] > d+w) {
                d1[v] = d+w;
                pq.push({d1[v], v});
            }
        }
    }

    if (d1[t] <= k) {
        cout<<n*(n-1)/2<<endl;
        return;
    }

    vector<int> d2(n, INF);
    d2[t]=0;

    pq.push({0, t});

    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d2[u]!=d) continue;

        for (auto [v, w] : adj[u]) {
            if (d2[v] > d+w) {
                d2[v] = d+w;
                pq.push({d2[v], v});
            }
        }
    }

    int cnt=0;

    sort(d1.begin(), d1.end());
    sort(d2.begin(), d2.end());

    int K = k-l;

    for (int i = 0; i<n; i++) {
        int left = K - d1[i];
        auto it = upper_bound(d2.begin(), d2.end(), left);
        cnt += (it - d2.begin());
    }

    cout<<cnt<<endl;
}

bool multi=false;

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

    int t=1;
    if (multi) cin>>t;
 
    while (t--) solve();
 
    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...