#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;
assert(query(cand) != 0);
std::vector<int> ret;
ret.push_back(cand[0]);
for (int i = 1; i < (int) cand.size() && (int) ret.size() < n; i++) {
std::vector<int> nw = ret;
nw.push_back(cand[i]);
if (query(exclude(ret)) == 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
**/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
33 ms |
348 KB |
Output is correct |
2 |
Correct |
37 ms |
348 KB |
Output is correct |
3 |
Correct |
35 ms |
344 KB |
Output is correct |
4 |
Correct |
36 ms |
348 KB |
Output is correct |
5 |
Correct |
32 ms |
348 KB |
Output is correct |
6 |
Correct |
32 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1116 ms |
920 KB |
Output is correct |
2 |
Correct |
1132 ms |
852 KB |
Output is correct |
3 |
Correct |
1038 ms |
728 KB |
Output is correct |
4 |
Correct |
1091 ms |
852 KB |
Output is correct |
5 |
Correct |
1137 ms |
732 KB |
Output is correct |
6 |
Correct |
1171 ms |
728 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3263 ms |
1076 KB |
Wrong Answer [3] |
2 |
Halted |
0 ms |
0 KB |
- |