Submission #874262

#TimeUsernameProblemLanguageResultExecution timeMemory
874262LucaLucaMSuper Dango Maker (JOI22_dango3)C++17
100 / 100
2395 ms1244 KiB
#include "dango3.h" #ifdef LOCAL #include "grader.cpp" #endif // LOCAL #include <vector> #include <random> #include <algorithm> #include <functional> #include <cassert> #include <iostream> std::mt19937 rng(3192702); void Solve(int n, int m) { /** sol in O(n * m^2) query uri: pornesc cu toate valorile ramase si de fiecare data incerc sa scot cate 1 **/ std::vector<int> id(n * m + 1); for (int i = 1; i <= n * m; i++) { id[i] = i; } shuffle(id.begin() + 1, id.end(), rng); auto query = [&] (std::vector<int> v) { std::vector<int> w; for (const auto &x : v) { w.push_back(id[x]); } return Query(w); }; auto answer = [&] (std::vector<int> v) { std::vector<int> w; for (const auto &x : v) { w.push_back(id[x]); } Answer(w); }; std::function<std::vector<int>(std::vector<int>)> exclude = [&] (std::vector<int> v) { bool dont[n * m + 1] = {}; for (const auto &x : v) { dont[x] = true; } std::vector<int> w; for (int i = 1; i <= n * m; i++) { if (!dont[i]) { w.push_back(i); } } return w; }; bool taken[n * m + 1] = {}; int SZ = 45'000 / m; for (int rep = 0; rep < m; rep++) { std::vector<int> cand; for (int i = 1; i <= n * m; i++) { if (!taken[i]) { cand.push_back(i); } } std::vector<int> idk; do { shuffle(cand.begin(), cand.end(), rng); idk = cand; if ((int) idk.size() > SZ) { idk.resize(SZ); } } while (query(idk) == 0); cand = idk; std::vector<int> ret; ret.push_back(cand[0]); int qq = query(exclude(ret)); for (int i = 1; i < (int) cand.size() && (int) ret.size() < n; i++) { std::vector<int> nw = ret; nw.push_back(cand[i]); if (qq == query(exclude(nw))) { ret.push_back(cand[i]); } } // std::cout << "! " << (int) ret.size() << '\n'; answer(ret); for (const auto &x : ret) { taken[x] = true; } } } /** 3 2 3 3 1 2 1 2 4 4 2 2 3 2 4 4 3 2 3 1 1 3 4 1 4 1 **/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...