Submission #806437

#TimeUsernameProblemLanguageResultExecution timeMemory
806437thimote75Wild Boar (JOI18_wild_boar)C++14
12 / 100
10098 ms1048576 KiB
#include <bits/stdc++.h> #define int long long using namespace std; string to_string(string s) { return s; } template <typename T> string to_string(T v) { bool first = true; string res = "["; for (const auto &x : v) { if (!first) res += ", "; first = false; res += to_string(x); } res += "]"; return res; } template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } void dbg_out() { cout << endl; } template <typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cout << ' ' << to_string(H); dbg_out(T...); } #ifdef DEBUG #define dbg(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__) #else #define dbg(...) #endif template <typename T> using grid = vector<vector<T>>; template <typename T> using space = grid<vector<T>>; using qi = pair<pair<int, int>, pair<int, int>>; template <typename T> using lpq = priority_queue<T, vector<T>, less<T>>; using idata = vector<int>; using graph = grid<pair<int, int>>; graph roads; idata path; struct State { int source = -1, distance = 1e18, count = 0; State next (int cost, int curr, int target) { State res; res.source = curr; res.distance = target == source ? 1e18 : cost + distance; res.count = count + 1 < path.size() && target == path[count + 1] ? count + 1 : count; return res; } }; int N, M, T, L; int modify (vector<State> &states, State new_state) { if (states[0].source == new_state.source) { if (new_state.distance >= states[0].distance) return -1; states[0].distance = new_state.distance; return 0; } else if (states[0].distance >= new_state.distance) { states[1] = states[0]; states[0] = new_state; return 0; } else if (states[1].source == new_state.source) { if (new_state.distance >= states[1].distance) return -1; states[1].distance = new_state.distance; return 1; } else if (states[1].distance > new_state.distance) { states[1] = new_state; return 1; } return -1; } int dijkstra () { space<State> dij_state (N, grid<State>(L, vector<State>(2))); lpq<qi> q; dij_state[path[0]][0][0].distance = 0; q.push({ { 0, 0 }, { path[0], 0 } }); while (q.size() != 0) { qi data = q.top(); q.pop(); int dist = data.first.first; int src = data.first.second; int curr = data.second.first; int uuid = data.second.second; if (dist == 1e18) continue ; State st = dij_state[curr][src][uuid]; if (st.distance != dist) continue ; for (const auto &road : roads[curr]) { int next = road.first; int cost = road.second; State nxt_state = st.next( cost, curr, next ); int res = modify(dij_state[next][nxt_state.count], nxt_state); if (res == -1) continue ; q.push({ { nxt_state.distance, nxt_state.count }, { next, res } }); } } int res = dij_state[path[L - 1]][L - 1][0].distance; return res == 1e18 ? -1 : res; } signed main () { cin >> N >> M >> T >> L; roads.resize(N); for (int i = 0; i < M; i ++) { int a, b, c; cin >> a >> b >> c; a --; b --; roads[a].push_back({ b, c }); roads[b].push_back({ a, c }); } path.resize(L); for (int i = 0; i < L; i ++) { cin >> path[i]; path[i] --; } for (int i = 0; i < T; i ++) { int p, v; cin >> p >> v; p --; v --; path[p] = v; cout << dijkstra() << "\n"; } }

Compilation message (stderr)

wild_boar.cpp: In member function 'State State::next(long long int, long long int, long long int)':
wild_boar.cpp:59:34: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         res.count    = count + 1 < path.size() && target == path[count + 1] ? count + 1 : 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...