Submission #1245971

#TimeUsernameProblemLanguageResultExecution timeMemory
1245971khoiSirni (COCI17_sirni)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; // Một struct để đẩy vào min‐heap cạnh giữa hai đỉnh l < r struct Edge { int l, r; int w; bool operator<(Edge const& o) const { return w > o.w; // để priority_queue mặc định thành min‐heap } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> P(n); for(int i = 0; i < n; i++) { cin >> P[i]; } // Nếu có giá trị trùng, chỉ giữ một sort(P.begin(), P.end()); P.erase(unique(P.begin(), P.end()), P.end()); n = (int)P.size(); // Khởi tạo multiset chứa cặp (value, original_index) set<pair<int,int>> S; S.reserve(n); for(int i = 0; i < n; i++){ S.insert({P[i], i}); } // Lưu iterator để tiện thao tác vector<set<pair<int,int>>::iterator> iter(n); { auto it = S.begin(); while(it != S.end()){ iter[it->second] = it; ++it; } } // Một mảng đánh dấu đã bị "xóa" (về mặt MST‐sweep) vector<bool> removed(n,false); // Min‐heap các cạnh giữa các phần tử kề nhau trong S priority_queue<Edge> pq; // Khởi tạo: với mỗi cặp kề nhau (it, nxt), thêm vào heap for(auto it = S.begin(); next(it) != S.end(); ++it){ auto jt = next(it); int u_idx = it->second; int v_idx = jt->second; int w = jt->first % it->first; // vì it->first < jt->first pq.push({u_idx, v_idx, w}); } // Bắt đầu sweep: mỗi bước chọn cạnh nhỏ nhất nối hai phần tử đang còn trong S ll total = 0; while((int)S.size() > 1){ auto E = pq.top(); pq.pop(); int l = E.l, r = E.r, w = E.w; if(removed[l] || removed[r]) continue; // kiểm tra thực sự l, r là kề nhau trong S auto itl = iter[l]; auto nitr = next(itl); if(nitr == S.end() || nitr->second != r) continue; // Nối vào MST total += w; // “Xóa” r khỏi S auto itr = iter[r]; auto prev_it = (itr == S.begin() ? S.end() : prev(itr)); auto next_it = next(itr); removed[r] = true; S.erase(itr); // Nếu có hàng xóm mới (prev_it, next_it) thì đẩy cạnh giữa họ vào heap if(prev_it != S.end() && next_it != S.end()){ int u2 = prev_it->second; int v2 = next_it->second; int w2 = next_it->first % prev_it->first; pq.push({u2, v2, w2}); } } cout << total << "\n"; return 0; }

Compilation message (stderr)

sirni.cpp: In function 'int main()':
sirni.cpp:31:7: error: 'class std::set<std::pair<int, int> >' has no member named 'reserve'
   31 |     S.reserve(n);
      |       ^~~~~~~