Submission #1309050

#TimeUsernameProblemLanguageResultExecution timeMemory
1309050IUA_HasinConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
436 ms72044 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
 
#define ll                                  long long
#define ld                                  long double
#define endl                                "\n"
#define yeap                                cout<<"YES"<<endl
#define nope                                cout<<"NO"<<endl
#define all(v)                              v.begin(), v.end()

using namespace std;
using namespace __gnu_pbds;

template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;


const ll infp = 1e18;
const ll infn = 1e18 * (-1);

const ll N = 2e6 + 10;
const ll M = 5e3 + 10;
const ll MOD = 998244353;


ll hceil(ll a, ll b){
    return (a+b-1)/b;
}

vector<pair<ll, ll>> graph[N];
vector<ll> dist(N, infp), vis(N, 0LL);

void dijkstra(ll source){
    set<pair<ll, ll>> s;
    s.insert({0, source});
    dist[source] = 0;

    while(s.size()>0){
        auto node = *s.begin();
        ll v = node.second;
        ll v_dist = node.first;
        s.erase(s.begin());
        if(vis[v]==0){
            for(auto child : graph[v]){
                ll v2 = child.first;
                ll wt = child.second;
                if((dist[v]+wt)<(dist[v2])){
                    dist[v2] = dist[v]+wt;
                    s.insert({dist[v2], v2});
                }
            }
            vis[v] = 1;
        }
    }
    
}

void solve(ll testcase){
    ll n, m, s, t, l, k;
    cin>>n>>m>>s>>t>>l>>k;

    for(int i=1; i<=m; i++){
        ll a, b, c;
        cin>>a>>b>>c;

        graph[a].push_back({b, c});
        graph[b].push_back({a, c});
    }

    ordered_multiset<ll> sts, stt;

    dijkstra(s);
    for(int i=1; i<=n; i++){
        sts.insert(dist[i]);
    }
    for(int i=1; i<=n; i++){
        vis[i] = 0, dist[i] = infp;
    }

    dijkstra(t);
    for(int i=1; i<=n; i++){
        stt.insert(dist[i]);
    }    

    if(dist[s]<=k){
        cout << (n * (n-1)) / 2 << endl;
    } else if(l > k){
        cout << 0 << endl; 
    } else {
        ll ans = 0;
        for(int i=1; i<=n; i++){
            ll temp = k - l - dist[i];
            ans += sts.order_of_key(temp + 1);
        }

        cout << ans << endl;
    }

    
    

    
    
    
}

int main(){
    #if __has_include("LOCAL.hh")
        #include "LOCAL.hh"
    #endif
 
    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
        freopen("output3.txt", "w", stdout);
        using namespace std::chrono;
        cout << fixed << setprecision(9);
        auto begin = steady_clock::now();
    #else
        std::ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    #endif

    int T = 1; 
    //cin>>T;
    for(int i=1; i<=T; i++){
        solve(i);
    }



 
 
    #ifdef LOCAL
        auto end = steady_clock::now();
        cout << "\nTime : " 
             << (ld)duration_cast<nanoseconds>
                (end - begin).count()/1000000000 
             << "s" << endl;
    #endif
 
 
    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...