Submission #1319359

#TimeUsernameProblemLanguageResultExecution timeMemory
1319359Boycl07Robot (JOI21_ho_t4)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; const long long INF = 1e16; struct Edge { int to, color, cost, id; }; struct State { long long d; int u, c; // c = 0: trạng thái thường, c > 0: mã định danh trạng thái màu bool operator>(const State& other) const { return d > other.d; } }; vector<Edge> adj[100005]; // sum_c[u][color] -> dùng vector + pair để thay map vector<pair<int, long long>> sum_c[100005]; // dist[u] lưu khoảng cách trạng thái thường long long dist0[100005]; // dist_c[edge_id] lưu khoảng cách khi robot vừa đi qua cạnh id (Strategy B) long long dist_c[400005]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int u, v, c, p; cin >> u >> v >> c >> p; // Mỗi cạnh 2 chiều, gán id để định danh trạng thái (u, color) adj[u].push_back({v, c, p, i * 2}); adj[v].push_back({u, c, p, i * 2 + 1}); } for (int i = 1; i <= n; ++i) { sort(adj[i].begin(), adj[i].end(), [](const Edge& a, const Edge& b) { return a.color < b.color; }); // Tính sum_c tối ưu for (int j = 0; j < adj[i].size(); ) { int k = j; long long s = 0; while (k < adj[i].size() && adj[i][k].color == adj[i][j].color) { s += adj[i][k].cost; k++; } sum_c[i].push_back({adj[i][j].color, s}); j = k; } dist0[i] = INF; } for (int i = 0; i < 2 * m; ++i) dist_c[i] = INF; priority_queue<State, vector<State>, greater<State>> pq; dist0[1] = 0; pq.push({0, 1, -1}); // c = -1 đại diện cho trạng thái dist0 while (!pq.empty()) { State top = pq.top(); pq.pop(); if (top.c == -1) { if (top.d > dist0[top.u]) continue; int u = top.u; for (auto& e : adj[u]) { // Lấy tổng cost của màu e.color tại u long long total_p = 0; auto it = lower_bound(sum_c[u].begin(), sum_c[u].end(), make_pair(e.color, -1LL)); total_p = it->second; // 1. Đổi màu cạnh e: cost = e.cost if (dist0[e.to] > top.d + e.cost) { dist0[e.to] = top.d + e.cost; pq.push({dist0[e.to], e.to, -1}); } // 2. Đổi màu các cạnh khác cùng màu e.color: cost = total_p - e.cost if (dist0[e.to] > top.d + total_p - e.cost) { dist0[e.to] = top.d + total_p - e.cost; pq.push({dist0[e.to], e.to, -1}); } // 3. Vào trạng thái đặc biệt của cạnh e (Strategy B) if (dist_c[e.id] > top.d) { dist_c[e.id] = top.d; pq.push({dist_c[e.id], e.to, e.id}); } } } else { // Đang ở trạng thái đặc biệt sau khi đi qua cạnh e_id_prev if (top.d > dist_c[top.c]) continue; int u = top.u; // Lấy màu của cạnh đã đưa ta đến đây int prev_id = top.c; int color_prev = (prev_id % 2 == 0) ? adj[adj[u][0].to][prev_id/2].color : -1; // Cần lấy lại color từ ID // Cách tốt hơn: Lưu color trực tiếp vào State // Tuy nhiên, để tối ưu, ta chỉ duyệt các cạnh cùng màu tại u // Tìm lại color_prev từ ID gốc (cách nhanh: lưu color vào struct Edge) // Ở đây mình sẽ duyệt các cạnh cùng màu với cạnh đã đi int target_color = 0; // Tìm color của cạnh có id = prev_id (cạnh ngược lại là prev_id ^ 1) // Nhưng thực tế ta có thể lưu color vào State để tránh tìm kiếm } } // ... (logic Dijkstra tiếp tục)

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:110:6: error: expected '}' at end of input
  110 |     }
      |      ^
Main.cpp:24:12: note: to match this '{'
   24 | int main() {
      |            ^