제출 #1309577

#제출 시각아이디문제언어결과실행 시간메모리
1309577ofozXoractive (IZhO19_xoractive)C++20
100 / 100
7 ms1120 KiB
#include <bits/stdc++.h> #include "interactive.h" using namespace std; #define ll long long #define double long double #define vc vector<char> #define vi vector<int> #define vii vector<vi> #define viii vector<vii> #define viiii vector<viii> #define viiiii vector<viiii> #define vb vector<bool> #define pi pair<double, double> #define ppi pair<pair<int, int>, int> #define pip pair<int, pair<int, int>> #define multi multiset<int> #define multp multiset<pi> #define endl '\n' int a1; vi exclusion(vi v1, vi v2) { multiset<int> s; for (int x : v1) s.insert(x); for (int x : v2) { if (!s.count(x)) continue; s.erase(s.lower_bound(x)); } vi res; for (int x : s) res.push_back(x); return res; } vi intersection(vi v1, vi v2) { vi res; map<int, int> s2; for (int x : v2) s2[x]++; for (int x : v1) { if (s2[x]) { s2[x]--; res.push_back(x); } } return res; } vi query(vi rng) { rng.push_back(1); vi q1 = get_pairwise_xor(rng); rng.pop_back(); vi q2 = get_pairwise_xor(rng); set<int> s; vi res; for (int x : exclusion(q1, q2)) { if (s.count(x) || !x) continue; res.push_back(x); s.insert(x); } return res; } vi guess(int n) { a1 = ask(1); vi rngTot; for (int i = 2; i <= n; i++) rngTot.push_back(i); vii arr; vector<pip> seg = {make_pair(0, make_pair(2, n))}; vii pos(n+1), notPos(n+1); vector<set<int>> notPosSet(n+1); for (int i = 0; i < 7; i++) { vector<pip> nwSeg; for (pip p : seg) { int m = (p.second.first + p.second.second)/2; nwSeg.push_back({0, make_pair(p.second.first, m)}); if (p.second.first != p.second.second) nwSeg.push_back({1, make_pair(m+1, p.second.second)}); } vi rng; for (pip p : nwSeg) { if (p.first) continue; for (int i = p.second.first; i <= p.second.second; i++) rng.push_back(i); } vi p1 = query(rng); seg = nwSeg; for (pip p : nwSeg) { for (int i = p.second.first; i <= p.second.second; i++) { if (!p.first) { if (pos[i].empty()) pos[i] = p1; else pos[i] = intersection(pos[i], p1); } else { for (int j : p1) { if (notPosSet[i].count(j)) continue; notPos[i].push_back(j); notPosSet[i].insert(j); } } } } } for (int i = 2; i <= n; i++) { // cerr << pos[i].size() << endl; pos[i] = exclusion(pos[i], notPos[i]); } vi res; res.push_back(a1); for (int i = 2; i <= n; i++) { res.push_back(pos[i][0] ^ a1); } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...