Submission #1262170

#TimeUsernameProblemLanguageResultExecution timeMemory
1262170khoile08Construction Project 2 (JOI24_ho_t2)C++20
0 / 100
3 ms4936 KiB
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i = a; i <= b; i++)
#define FOD(i,a,b) for(int i = a; i >= b; i--)
//#define int long long
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ull unsigned long long
#define db double
#define lcm(a,b) a / __gcd(a, b) * b
#define ii pair<int,int>
#define iii pair<int,pair<int,int>>
#define iv pair<pair<int,int>,pair<int,int>>
#define sq(a) (a) * (a)
#define MASK(i) (1LL << i)
#define task "task"

const int inf = 1e9;
const ll INF = 1e18;
const int mod = 1e9 + 7;
const int N = 2e5 + 5;

int n, m, s, t, l;
ll k;
vector<ii> g[N];
ll d[2][N], a[N], b[N];

void Dijkstra(int sr, ll d[]) {
    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq;
    pq.push({0, sr});
    FOR(i, 1, n) d[i] = INF;
    d[sr] = 0;
    while(!pq.empty()) {
        ll cost = pq.top().fi;
        int u = pq.top().se;
        pq.pop();
        if(cost != d[u]) continue;
        for(auto H : g[u]) {
            int v = H.fi;
            int w = H.se;
            if(d[v] > d[u] + w) {
                d[v] = d[u] + w;
                pq.push({d[v], v});
            }
        }
    }
}

ll ans;

vector<ll> val;
int cnt;

struct Bit {
    int bit[2 * N];

    void reset() {
        FOR(i, 1, cnt) bit[i] = 0;
    }

    void up(int x, int val) {
        for(; x <= cnt; x += x & -x) bit[x] += val;
    }

    int get(int x) {
        int ret = 0;
        for(; x; x -= x & -x) ret += bit[x];
        return ret;
    }

    int getrange(int l, int r) {
        return (l > 1 ? get(r) - get(l - 1) : get(r));
    }
};
Bit bit;

int get_idx(int x) {
    return lower_bound(val.begin(), val.end(), x) - val.begin() + 1;
}

void process(ll a[], ll b[]) {
    FOR(i, 1, n) {
        val.pb(a[i]);
        val.pb(-b[i]);
    }
    sort(val.begin(), val.end());
    val.erase(unique(val.begin(), val.end()), val.end());
    cnt = val.size();
    FOR(i, 1, n) {
        ans += bit.getrange(get_idx(a[i]), cnt);
        bit.up(get_idx(-b[i]), 1);
    }
    bit.reset();
    val.clear();
}

void KhoiLe() {
    Dijkstra(s, d[0]);
    Dijkstra(t, d[1]);

    if(d[0][t] <= k) {
        cout << (1LL * n * (n - 1) / 2) << '\n';
        return;
    }

    /// x < y
    /// d1[x] + dn[y] + l <= k <=> dn[y] + l - k <= -d1[x]
    /// dn[x] + d1[y] + l <= k <=> d1[y] + k - k <= -dn[x]

    FOR(i, 1, n) {
        a[i] = d[1][i] + l - k;
//        cout << a[i] << ' ' << -d[0][i] << '\n';
        b[i] = d[0][i] + l - k;
    }
    process(a, d[0]);
    process(b, d[1]);

    cout << ans << '\n';
}

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

    int test = 1;
//    cin >> test;
    while(test--) {
        cin >> n >> m >> s >> t >> l >> k;
        FOR(i, 1, m) {
            int u, v, w;
            cin >> u >> v >> w;
            g[u].pb({v, w});
            g[v].pb({u, w});
        }
        KhoiLe();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...