Submission #1274939

#TimeUsernameProblemLanguageResultExecution timeMemory
1274939hynmjConstruction Project 2 (JOI24_ho_t2)C++20
8 / 100
259 ms25780 KiB
#include <bits/stdc++.h> #define pi pair<int, int> #define int long long #define ff first #define ss second using namespace std; const int N = 1ll << 18; vector<pi> graph[N]; int value[N << 3]; void add(int i, int val, int cur = 1, int l = 0, int r = N) { if (i < l || i > r) return; if (l == r) { value[cur] += val; return; } int lc = cur + cur, rc = lc + 1, mid = (l + r) / 2; add(i, val, lc, l, mid); add(i, val, rc, mid + 1, r); value[cur] = value[lc] + value[rc]; } int calculate(int l, int r, int cur = 1, int st = 0, int en = N) { if (r < st || l > en) return 0; if (st >= l && en <= r) return value[cur]; int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2; return calculate(l, r, lc, st, mid) + calculate(l, r, rc, mid + 1, en); } vector<int> dijkstra(int start) { vector<int> dist(N, 1e18); priority_queue<pi, vector<pi>, greater<pi>> q; q.push({0, start}); dist[start] = 0; int node, weight; while (q.size()) { node = q.top().ss; q.pop(); for (auto i : graph[node]) { if (dist[i.ss] > dist[node] + i.ff) { dist[i.ss] = dist[node] + i.ff; q.push({dist[i.ss], i.ss}); } } } return dist; } void solve() { int n, m; cin >> n >> m; int s, t, l, k; cin >> s >> t >> l >> k; int u, v, w; for (int i = 0; i < m; i++) { cin >> u >> v >> w; graph[u].push_back({w, v}); graph[v].push_back({w, u}); } vector<int> sdist = dijkstra(s); vector<int> tdist = dijkstra(t); if (sdist[t] <= k) { cout << n * (n - 1) / 2; return; } int ans1 = 0; int ans = 0; // add(0, 1); for (int i = 1; i <= n; i++) { if (tdist[i] <= 1e18) add(tdist[i], 1); // cout << calculate(0, 1) << endl; } for (int i = 1; i <= n; i++) { // continue; if (tdist[i] <= n) add(tdist[i], -1); int kk = calculate(0, k - l - sdist[i]); ans += kk; // cout << "for " << i << " we have " << kk << endl; // cout << "ans = " << ans << endl; } for (int i = 1; i <= n; i++) { if (sdist[i] <= 1e18) add(sdist[i], 1); // cout << calculate(0, 1) << endl; } for (int i = 1; i <= n; i++) { // continue; if (sdist[i] <= n) add(sdist[i], -1); int kk = calculate(0, k - l - tdist[i]); ans += kk; // cout << "for " << i << " we have " << kk << endl; // cout << "ans = " << ans << endl; } cout << ans << endl; } signed main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); int t = 1; // cin >> t; while (t--) { solve(); cout << endl; } 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...