Submission #1324656

#TimeUsernameProblemLanguageResultExecution timeMemory
1324656norrawichzzzConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
149 ms24244 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pi pair<int,int>

const int INF = 4e18;

int32_t main() {
    cin.tie(0)->sync_with_stdio(0);
    int n,m;
    cin>> n>> m;

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

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

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

    vector<int> dist(n+1, INF), rdist(n+1, INF);
    dist[s] = 0;
    rdist[t] = 0;

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

    while (!pq.empty()) {
        int u=pq.top().second, d=pq.top().first;
        pq.pop();

        if (dist[u] < d) continue;

        for (auto &x : g[u]) {
            int v=x.first, w=x.second;

            if (dist[v] > dist[u]+w) {
                dist[v] = dist[u]+w;
                pq.push({dist[v], v});
            }
        }
    }

    pq.push({0, t});
    while (!pq.empty()) {
        int u=pq.top().second, d=pq.top().first;
        pq.pop();

        if (rdist[u] < d) continue;

        for (auto &x : g[u]) {
            int v=x.first, w=x.second;

            if (rdist[v] > rdist[u]+w) {
                rdist[v] = rdist[u]+w;
                pq.push({rdist[v], v});
            }
        }
    }

    if (dist[t]<=k) {
        cout<< n*(n-1)/2;
        return 0;
    }
    
    vector<int> ans;
    for (int i=1; i<=n; i++) ans.push_back(rdist[i]);

    sort(ans.begin(), ans.end());
    
    int cnt=0;
    for (int i=1; i<=n; i++) {
        int can = dist[i] + l;
        
        int l=0, r=ans.size()-1;
        while (l<=r) {
            int mid=(l+r)/2;

            if (ans[mid]+can <= k) l=mid+1;
            else r=mid-1;
        }
        if (r!=-1) cnt+=l;
    }
    cout<< cnt;
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...