Submission #1263105

#TimeUsernameProblemLanguageResultExecution timeMemory
1263105norman165Construction Project 2 (JOI24_ho_t2)C++20
100 / 100
553 ms51516 KiB
#include <bits/stdc++.h> #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define int long long #define yes() cout << "YES\n" #define no() cout << "NO\n" using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; const int inf = 1e18; const int mod = 1e9 + 7; const int maxn = 1e6; const int mod1 = 998244353; const int mod2 = 1e18 + 1; const int mod3 = 1e9 + 9; const int mod4 = 333333333; const int mod5 = 200000; const int mod6 = 10007; const int k = 3000; const int w = 1e5; const ld EPS = 1e-8; int LOG = 30; struct segTree { vector<int> t; int n; segTree(int x) { n = x; t.resize(4 * n); } int get(int v, int l, int r, int ql, int qr) { if (l >= qr || r <= ql) return 0ll; if (ql <= l && r <= qr) return t[v]; int m = (l + r) / 2; return get(2 * v, l, m, ql, qr) + get(2 * v + 1, m, r, ql, qr); } int get(int ql, int qr) { return get(1, 0, n, ql, qr); } void upd(int v, int l, int r, int idx, int val) { if (r - l == 1) { t[v] += val; return; } int m = (l + r) / 2; if (idx < m) upd(2 * v, l, m, idx, val); else upd(2 * v + 1, m, r, idx, val); t[v] = t[2 * v] + t[2 * v + 1]; } void upd(int idx, int val) { upd(1, 0, n, idx, val); } }; void solve() { int n, m, s, t, l, k; cin >> n >> m >> s >> t >> l >> k; s--, t--; vector<vector<pair<int, int>>> g(n); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; u--, v--; g[u].push_back({v, w}); g[v].push_back({u, w}); } vector<int> d1(n, inf); set<pair<int, int>> st; d1[s] = 0; st.insert({0, s}); while (st.size()) { int v = st.begin()->second; st.erase(st.begin()); for (auto& [u, w] : g[v]) { if (d1[u] > d1[v] + w) { if (st.count({d1[u], u})) st.erase({d1[u], u}); d1[u] = d1[v] + w; st.insert({d1[u], u}); } } } if (d1[t] <= k) { cout << n * (n - 1) / 2 << "\n"; return; } vector<int> d2(n, inf); d2[t] = 0; st.insert({0, t}); while (st.size()) { int v = st.begin()->second; st.erase(st.begin()); for (auto& [u, w] : g[v]) { if (d2[u] > d2[v] + w) { if (st.count({d2[u], u})) st.erase({d2[u], u}); d2[u] = d2[v] + w; st.insert({d2[u], u}); } } } segTree st1(2e5 + 10), st2(2e5 + 10); set<int> st3, st4; vector<int> c; for (int i = 0; i < n; i++) c.push_back(d2[i]); sort(all(c)); c.resize(unique(all(c)) - c.begin()); int ans = 0; for (int i = n - 1; i >= 0; i--) { auto it = st3.upper_bound(k - l - d1[i]); if (it != st3.begin()) { it--; int idx = lower_bound(all(c), *it) - c.begin(); ans += st1.get(0, idx + 1); } int idx = lower_bound(all(c), d2[i]) - c.begin(); st1.upd(idx, 1); st3.insert(d2[i]); } c.clear(); for (int i = 0; i < n; i++) c.push_back(d1[i]); sort(all(c)); c.resize(unique(all(c)) - c.begin()); for (int i = n - 1; i >= 0; i--) { auto it = st4.upper_bound(k - l - d2[i]); if (it != st4.begin()) { it--; int idx = lower_bound(all(c), *it) - c.begin(); ans += st2.get(0, idx + 1); } int idx = lower_bound(all(c), d1[i]) - c.begin(); st2.upd(idx, 1); st4.insert(d1[i]); } cout << ans << "\n"; } signed main() { // cout.precision(16); ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin >> t; while (t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...