Submission #516636

#TimeUsernameProblemLanguageResultExecution timeMemory
516636Be_dosEvacuation plan (IZhO18_plan)C++17
100 / 100
709 ms58084 KiB
#include <iostream> #include <cmath> #include <cctype> #include <vector> #include <algorithm> #include <set> #include <map> #include <deque> #include <stack> #include <unordered_set> #include <sstream> #include <cstring> #include <iomanip> #include <queue> #include <unordered_map> #include <random> #include <cfloat> #include <chrono> #include <bitset> #include <complex> #include <immintrin.h> #include <cassert> int32_t* answers; struct DSU { int32_t* parents; std::set<int32_t>* per_comp; DSU(int32_t n) { parents = new int32_t[n]; per_comp = new std::set<int32_t>[n]; for(int32_t i = 0; i < n; i++) parents[i] = i; } int32_t get_root(int32_t v) { if(parents[v] == v) return v; return parents[v] = get_root(parents[v]); } void join(int32_t v1, int32_t v2, int32_t answer_if) { v1 = get_root(v1); v2 = get_root(v2); if(v1 == v2) return; if(per_comp[v1].size() < per_comp[v2].size()) std::swap(v1, v2); for(auto it = per_comp[v2].begin(); it != per_comp[v2].end(); it++) if(per_comp[v1].find(*it) != per_comp[v1].end()) { answers[*it] = answer_if; } else per_comp[v1].insert(*it); parents[v2] = v1; } }; void dijkstra(std::vector<int32_t>& starts, int32_t n, std::vector<std::pair<int32_t, int32_t> >* graph, int32_t* dist) { for(int32_t i = 0; i < n; i++) dist[i] = INT32_MAX; std::set<std::pair<int32_t, int32_t> > active; for(int32_t i = 0; i < starts.size(); i++) { dist[starts[i]] = 0; active.emplace(0, starts[i]); } while(!active.empty()) { int32_t v = active.begin()->second; active.erase(active.begin()); for(int32_t i = 0; i < graph[v].size(); i++) if(dist[v] + graph[v][i].second < dist[graph[v][i].first]) { auto it = active.find({dist[graph[v][i].first], graph[v][i].first}); if(it != active.end()) active.erase(it); dist[graph[v][i].first] = dist[v] + graph[v][i].second; active.emplace(dist[graph[v][i].first], graph[v][i].first); } } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int32_t n, m; std::cin >> n >> m; std::vector<std::pair<int32_t, int32_t> >* graph = new std::vector<std::pair<int32_t, int32_t> >[n]; for(int32_t i = 0; i < m; i++) { int32_t src, dst, weight; std::cin >> src >> dst >> weight; src--; dst--; graph[src].emplace_back(dst, weight); graph[dst].emplace_back(src, weight); } int32_t k; std::cin >> k; std::vector<int32_t> starts; for(int32_t i = 0; i < k; i++) { int32_t v; std::cin >> v; v--; starts.push_back(v); } int32_t* dist = new int32_t[n]; dijkstra(starts, n, graph, dist); int32_t num_q; std::cin >> num_q; DSU dsu(n); for(int32_t q = 0; q < num_q; q++) { int32_t src, dst; std::cin >> src >> dst; src--; dst--; dsu.per_comp[src].insert(q); dsu.per_comp[dst].insert(q); } answers = new int32_t[num_q]; int32_t* order = new int32_t[n]; for(int32_t i = 0; i < n; i++) order[i] = i; std::sort(order, order + n, [&](int32_t v1, int32_t v2) { return dist[v1] > dist[v2]; }); bool* active = new bool[n]; for(int32_t i = 0; i < n; i++) active[i] = false; for(int32_t i = 0; i < n; i++) { active[order[i]] = true; for(int32_t j = 0; j < graph[order[i]].size(); j++) if(active[graph[order[i]][j].first]) dsu.join(order[i], graph[order[i]][j].first, dist[order[i]]); } for(int32_t q = 0; q < num_q; q++) std::cout << answers[q] << "\n"; return 0; }

Compilation message (stderr)

plan.cpp: In function 'void dijkstra(std::vector<int>&, int32_t, std::vector<std::pair<int, int> >*, int32_t*)':
plan.cpp:63:26: warning: comparison of integer expressions of different signedness: 'int32_t' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for(int32_t i = 0; i < starts.size(); i++) {
      |                        ~~^~~~~~~~~~~~~~~
plan.cpp:71:30: warning: comparison of integer expressions of different signedness: 'int32_t' {aka 'int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |         for(int32_t i = 0; i < graph[v].size(); i++)
      |                            ~~^~~~~~~~~~~~~~~~~
plan.cpp: In function 'int main()':
plan.cpp:141:30: warning: comparison of integer expressions of different signedness: 'int32_t' {aka 'int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |         for(int32_t j = 0; j < graph[order[i]].size(); j++)
      |                            ~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...