Solutions of Minimum Xor Pair Query - MarisaOJ: Marisa Online Judge

Solutions of Minimum Xor Pair Query

Select solution language

Write solution here.


User Avatar hungkm466    Created at    1 likes

## Hướng dẫn **Nhận xét:** min(x ⊕ y, y ⊕ z) < x ⊕ z với (x < y < z).\ Từ nhận xét trên, hoàn toàn có thể làm được bài này với CTDL multiset với thao tác **Thêm**, **Xoá** và **Lấy min**.\ Sử dụng 2 multiset: 1 để lưu dãy số, 1 để lưu min giữa 2 phần tử liên tiếp. Code: ``` #include <bits/stdc++.h> using namespace std; multiset<int> ms; multiset<int> ans; int x,q; void query1(void) { cin >> x; auto r = ms.lower_bound(x); if (r != ms.begin()) { auto l = prev(r); if (r != ms.end()) ans.erase(ans.find((*l) ^ (*r))); ans.insert((*l) ^ x); } if (r != ms.end()) ans.insert((*r) ^ x); ms.insert(x); } void query2(void) { cin >> x; auto it = ms.find(x); if (it != ms.begin()) { auto l = prev(it); ans.erase(ans.find((*l) ^ x)); } auto r = next(it); if (r != ms.end()) ans.erase(ans.find((*r) ^ x)); if (it != ms.begin() && r != ms.end()) ans.insert( (*prev(it)) ^ (*r) ); ms.erase(it); } void query3(void) { cout << *ans.begin() << '\n'; } signed main(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); for (cin >> q; q--;) { int opt; cin >> opt; if (opt == 1) query1(); if (opt == 2) query2(); if (opt == 3) query3(); } return 0; } ```