Submission #1274968

#TimeUsernameProblemLanguageResultExecution timeMemory
1274968hynmjConstruction Project 2 (JOI24_ho_t2)C++20
16 / 100
2095 ms21876 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 = 2e5 + 7; vector<pi> graph[N]; typedef long long ll; // Structure of the node struct Node { ll value; struct Node *L, *R; }; // Structure to get the newly formed // node struct Node *getnode() { struct Node *temp = new struct Node; temp->value = 0; temp->L = NULL; temp->R = NULL; return temp; } // Creating the Root node struct Node *root; // Function to perform the point update // on the dynamic segment tree void UpdateHelper(struct Node *curr, ll index, ll L, ll R, ll val) { // If the index is not overlapping // with the index if (L > index || R < index) return; // If the index is completely overlapping // with the index if (L == R && L == index) { // Update the value of the node // to the given value curr->value += val; return; } // Computing the middle index if none // of the above base cases are satisfied ll mid = L - (L - R) / 2; ll sum1 = 0, sum2 = 0; // If the index is in the left subtree if (index <= mid) { // Create a new node if the left // subtree is null if (curr->L == NULL) curr->L = getnode(); // Recursively call the function // for the left subtree UpdateHelper(curr->L, index, L, mid, val); } // If the index is in the right subtree else { // Create a new node if the right // subtree is null if (curr->R == NULL) curr->R = getnode(); // Recursively call the function // for the right subtree UpdateHelper(curr->R, index, mid + 1, R, val); } // Storing the sum of the left subtree if (curr->L) sum1 = curr->L->value; // Storing the sum of the right subtree if (curr->R) sum2 = curr->R->value; // Storing the sum of the children into // the node's value curr->value = sum1 + sum2; return; } // Function to find the sum of the // values given by the range ll queryHelper(struct Node *curr, ll a, ll b, ll L, ll R) { // Return 0 if the root is null if (curr == NULL) return 0; // If the index is not overlapping // with the index, then the node // is not created. So sum is 0 if (L > b || R < a) return 0; // If the index is completely overlapping // with the index, return the node's value if (L >= a && R <= b) return curr->value; ll mid = L - (L - R) / 2; // Return the sum of values stored // at the node's children return queryHelper(curr->L, a, b, L, mid) + queryHelper(curr->R, a, b, mid + 1, R); } // Function to call the queryHelper // function to find the sum for // the query ll query(int L, int R) { return queryHelper(root, L, R, 0, 1e15); } // Function to call the UpdateHelper // function for the point update void update(int index, int value) { UpdateHelper(root, index, 0, 1e15, value); } vector<int> dijkstra(int start) { vector<int> dist(N, 1e18); priority_queue<pi, vector<pi>, less<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() { root = getnode(); 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; // cout << ans1 << endl; // cout << "------" << endl; // update(0, 1); for (int i = 1; i <= n; i++) { if (tdist[i] <= 1e18) update(tdist[i], 1); // cout << tdist[i] << " "; } // cout << endl; for (int i = 1; i <= n; i++) { // cout << sdist[i] << " "; } // cout << endl; // cout << query(0, 2) << endl; for (int i = 1; i <= n; i++) { // continue; if (tdist[i] < 1e18) update(tdist[i], -1); int kk = query(0, k - l - sdist[i]); ans += kk; // cout << "for " << i << " we have " << kk << endl; // cout << "ans = " << ans << endl; } root = getnode(); for (int i = 1; i <= n; i++) { if (sdist[i] <= 1e18) update(sdist[i], 1); // cout << query(0, 1) << endl; } for (int i = 1; i <= n; i++) { // continue; if (sdist[i] < 1e18) update(sdist[i], -1); int kk = query(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...