Submission #1163521

#TimeUsernameProblemLanguageResultExecution timeMemory
1163521shraefktConstruction Project 2 (JOI24_ho_t2)C++20
8 / 100
88 ms27964 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAX = 200007; const int INF = LLONG_MAX; vector <pair<int,int>> adjlist[MAX]; // {weight,node} //return distance, node vector <pair<int,int>> dijkstra(int source, int x) { // find nodes with distance less than or equal to x from source int dist[MAX]; fill(dist,dist+MAX-1,INF); priority_queue <pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq; pq.push({0,source}); vector<pair<int,int>> candidates; while (!pq.empty()) { int d = pq.top().first; int n = pq.top().second; if (d>x) break; pq.pop(); if (dist[n] != INF) continue; dist[n] = d; candidates.push_back({d,n}); for (int i=0;i<adjlist[n].size();i++) { int v = adjlist[n][i].first; // neighbour int u = adjlist[n][i].second; // neighbour weight if (dist[v] == INF) { pq.push({dist[n] + u,v}); } } } return candidates; } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int N,M,S,T,L,K; cin >> N >> M >> S >> T >> L >> K; int a,b,c; for (int i=0;i<M;i++) { cin >> a >> b >> c; adjlist[a].push_back({b,c}); adjlist[b].push_back({a,c}); } vector <pair<int,int>> testing = dijkstra(S,K); for (auto &pair: testing) { if (pair.second == T) { cout << (N) * (N-1) / 2; return 0; } } //run dijkstra twice vector <pair<int,int>> from_source; from_source = dijkstra(S,L); /* for (auto &z: from_source) { cout << z.first << " " << z.second << endl; } cout << "-----" << endl; */ vector <pair<int,int>> to_source = dijkstra(T,K-L); /* for (auto &z: to_source) { cout << z.first << " " << z.second << endl; } cout << "-----" << endl; */ multiset<pair<int,int>> from_ms; from_ms.insert(from_source.begin(),from_source.end()); multiset<pair<int,int>> to_ms; to_ms.insert(to_source.begin(),to_source.end()); int count = 0; for (auto &candidate: to_ms) { //cout << candidate.first << endl; auto it = from_ms.upper_bound({K - L - candidate.first, INF}); if (it == from_ms.end()) { count += from_ms.size(); continue; } int t = distance(from_ms.begin(), it); //cout << t << endl; count += t; } cout << count; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...