Submission #637392

#TimeUsernameProblemLanguageResultExecution timeMemory
637392AlperenTMinerals (JOI19_minerals)C++17
100 / 100
389 ms6444 KiB
#include <bits/stdc++.h> #include "minerals.h" using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int cnt; set<int> minerals; int query(int x){ if(minerals.find(x) != minerals.end()) minerals.erase(x); else minerals.insert(x); return cnt = Query(x); } struct Item{ int x, i; }; void solve(int l, int r, vector<int> &a, vector<Item> b, bool flag){ if(l > r) return; else if(l == r) Answer(a[l], b[0].x); else{ int m = r - (r - l) * 0.375; vector<Item> lft, rght; for(int i = m + 1; i <= r; i++) query(a[i]); for(auto p : b){ if(p.i <= m) lft.push_back(p); else if(lft.size() == m - l + 1) rght.push_back(p); else if(rght.size() == r - m) lft.push_back(p); else if(minerals.find(p.x) == minerals.end()){ int prvcnt = cnt; query(p.x); if(flag){ if(cnt == prvcnt + 1) rght.push_back(p); else lft.push_back(p); } else{ if(cnt == prvcnt + 1) lft.push_back(p); else rght.push_back(p); } } else{ int prvcnt = cnt; query(p.x); if(flag){ if(cnt == prvcnt - 1) rght.push_back(p); else lft.push_back(p); } else{ if(cnt == prvcnt - 1) lft.push_back(p); else rght.push_back(p); } } } solve(l, m, a, lft, flag); solve(m + 1, r, a, rght, !flag); } } void Solve(int n) { vector<int> nums, a, c1, c2, indxs; vector<Item> tmp, b; nums.assign(n * 2, 0); iota(nums.begin(), nums.end(), 1); shuffle(nums.begin(), nums.end(), rng); for(int i = 0; i < n; i++){ int prvcnt = cnt; query(nums[i]); if(cnt == prvcnt + 1) tmp.push_back({nums[i], i}); else b.push_back({nums[i], i}); } for(auto p : tmp){ int prvcnt = cnt; query(p.x); if(cnt == prvcnt - 1) c1.push_back(p.x); else{ a.push_back(p.x); indxs.push_back(p.i); } } for(auto &p : b) p.i = upper_bound(indxs.begin(), indxs.end(), p.i) - indxs.begin() - 1; solve(0, (int)a.size() - 1, a, b, false); a.clear(), b.clear(), tmp.clear(), indxs.clear(); for(int i = n; i < 2 * n; i++){ int prvcnt = cnt; query(nums[i]); if(cnt == prvcnt + 1) tmp.push_back({nums[i], i}); else b.push_back({nums[i], i}); } for(auto p : tmp){ int prvcnt = cnt; query(p.x); if(cnt == prvcnt - 1) c2.push_back(p.x); else{ a.push_back(p.x); indxs.push_back(p.i); } } for(auto &p : b) p.i = upper_bound(indxs.begin(), indxs.end(), p.i) - indxs.begin() - 1; solve(0, (int)a.size() - 1, a, b, false); a = c1; b.clear(); for(auto x : c2) b.push_back({x, (int)a.size()}); solve(0, (int)a.size() - 1, a, b, false); }

Compilation message (stderr)

minerals.cpp: In function 'void solve(int, int, std::vector<int>&, std::vector<Item>, bool)':
minerals.cpp:35:32: warning: comparison of integer expressions of different signedness: 'std::vector<Item>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   35 |             else if(lft.size() == m - l + 1) rght.push_back(p);
      |                     ~~~~~~~~~~~^~~~~~~~~~~~
minerals.cpp:36:33: warning: comparison of integer expressions of different signedness: 'std::vector<Item>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   36 |             else if(rght.size() == r - m) lft.push_back(p);
      |                     ~~~~~~~~~~~~^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...