Submission #390301

#TimeUsernameProblemLanguageResultExecution timeMemory
390301oleksgRobot (JOI21_ho_t4)C++14
34 / 100
3072 ms81404 KiB
#pragma GCC optimize("O2") #include <fstream> #include <string> #include <iostream> #include <bitset> #include <math.h> #include <string> #include <algorithm> #include <assert.h> #include <bits/stdc++.h> #include <vector> #include <queue> #include<stdio.h> #include<ctype.h> #define ll long long using namespace std; ll n, m; struct con{ ll d; ll color; ll cost; }; vector<con> cons[200001]; map<ll, ll> cost[200001]; // how much to convert all nodes of a color to some other color map<ll, ll> dist[200001]; map<ll, ll> used[200001]; //if node with color x was used int main(){ cin >> n >> m; ll one, two, three, four; for (int x = 0; x < m; x++){ cin >> one >> two >> three >> four; cons[one - 1].push_back({two - 1, three, four}); cons[two - 1].push_back({one - 1, three, four}); } for (int x = 0; x < n; x++){ for (int y = 0; y < cons[x].size(); y++){ ll col = cons[x][y].color; ll cst = cons[x][y].cost; if (cost[x].find(col) == cost[x].end()){ cost[x][col] = cst; } else { cost[x][col] += cst; } } } priority_queue<tuple<ll, ll, ll>> q; //cost, node, color q.push(make_tuple(0, 0, 0)); while(q.size() > 0){ ll node; ll cst; ll color; tie(cst, node, color) = q.top(); used[node][color] = 1; q.pop(); cst *= -1; if (color != 0){ //we need to go to a node with the same color for (auto con: cons[node]){ if (con.color == color){ if (used[con.d].find(0) == used[con.d].end()){ ll ncost = cst + cost[node][color] - con.cost; if (dist[con.d].find(0) == dist[con.d].end() || dist[con.d][0] > ncost){ dist[con.d][0] = ncost; q.push(make_tuple(-1 * ncost, con.d, 0)); } } } } } else{ //there are 3 things which we can do for (auto con: cons[node]){ if (used[con.d].find(con.color) == used[con.d].end()){ //dont switch anything and make the next node switch ll ncost = cst; if (dist[con.d].find(con.color) == dist[con.d].end() || dist[con.d][con.color] > ncost){ dist[con.d][con.color] = ncost; q.push(make_tuple(-1 * ncost, con.d, con.color)); } } if (used[con.d].find(0) == used[con.d].end()){ //switch everything but the connection ll ncost = cst + cost[node][con.color] - con.cost; if (dist[con.d].find(0) == dist[con.d].end() || dist[con.d][0] > ncost){ dist[con.d][0] = ncost; q.push(make_tuple(-1 * ncost, con.d, 0)); } //switch our node only ncost = cst + con.cost; if (dist[con.d].find(0) == dist[con.d].end() || dist[con.d][0] > ncost){ dist[con.d][0] = ncost; q.push(make_tuple(-1 * ncost, con.d, 0)); } } } } } if (dist[n - 1].find(0) == dist[n - 1].end()){ cout << -1 << "\n"; } else{ cout << dist[n - 1][0] << "\n"; } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:44:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<con>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         for (int y = 0; y < cons[x].size(); y++){
      |                         ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...