#include "koala.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <random>
#include <vector>
typedef long long llong;
const int MAXN = 128;
const int INF = 1e9;
int n, w;
int __b[MAXN];
int __r[MAXN];
std::vector <int> play(const std::vector <int> &b)
{
assert(b.size() == n);
for (int i = 0 ; i < n ; ++i)
{
__b[i] = b[i];
}
playRound(__b, __r);
std::vector <int> r(n);
for (int i = 0 ; i < n ; ++i)
{
r[i] = __r[i];
}
return r;
}
int minValue(int N, int W)
{
n = N; w = W;
std::vector <int> askFor(n, 0);
askFor[0] = 1;
std::vector <int> r = play(askFor);
for (int i = 0 ; i < N ; ++i)
{
if (r[i] == 0)
{
return i;
}
}
// TODO: Implement Subtask 1 solution here.
// You may leave this function unmodified if you are not attempting this
// subtask.
return 0;
}
int maxValue(int N, int W)
{
n = N; w = W;
int step = 0;
std::vector <int> candidates(n);
std::iota(candidates.begin(), candidates.end(), 0);
while (candidates.size() > 1)
{
step++;
std::vector <int> b(n, 0);
for (const int &pos : candidates)
{
b[pos] = w / candidates.size();
}
// step = 2 * step;
std::vector <int> r = play(b);
std::vector <int> newCandidates;
for (const int &pos : candidates)
{
if (r[pos] > b[pos])
{
newCandidates.push_back(pos);
}
}
candidates = newCandidates;
}
// TODO: Implement Subtask 2 solution here.
// You may leave this function unmodified if you are not attempting this
// subtask.
return candidates[0];
}
int knownValues[MAXN];
bool cmp(int x, int y)
{
if (knownValues[x] != 0 && knownValues[y] != 0)
{
return (knownValues[x] < knownValues[y]);
}
if (knownValues[x] != 0)
{
return true;
}
if (knownValues[y] != 0)
{
return false;
}
int times = 0;
int l = 1, rr = 9, mid;
while (l + 1 < rr)
{
times++;
mid = l + (rr - l + 1) / 2 + 2 * (rr - l == 8) + (l == 1 && rr == 6);
std::vector <int> b(n, 0);
b[x] = b[y] = mid;
std::vector <int> r = play(b);
if (r[x] > b[x] && r[y] <= b[y]) return false;
if (r[y] > b[y] && r[x] <= b[x]) return true;
if (r[x] <= b[x]) rr = mid;
else l = mid;
}
std::vector <int> b(n, 0);
b[x] = b[y] = 1;
std::vector <int> r = play(b);
if (r[x] > b[x] && r[y] <= b[y]) return false;
if (r[y] > b[y] && r[x] <= b[x]) return true;
assert(false);
}
int greaterValue(int N, int W)
{
n = N; w = W;
int x = 0, y = 1;
int times = 0;
int l = 0, rr = 9, mid;
while (l + 1 < rr)
{
times++;
mid = l + (rr - l + 1) / 2;
std::vector <int> b(n, 0);
b[x] = b[y] = mid;
std::vector <int> r = play(b);
if (r[x] > b[x] && r[y] <= b[y]) return false;
if (r[y] > b[y] && r[x] <= b[x]) return true;
if (r[x] <= b[x]) rr = mid;
else l = mid;
}
assert(false);
}
bool sigmaCMP(int x, int y)
{
std::vector <int> b(n, 0);
b[x] = b[y] = w / 2;
std::vector <int> r = play(b);
if (r[x] > n) return false;
return true;
}
int toSort[MAXN];
int cpy[MAXN];
void sigmaMerge(int l, int r)
{
if (l == r)
{
return;
}
int mid = (l + r) / 2;
sigmaMerge(l, mid);
sigmaMerge(mid + 1, r);
int lPtr = l, rPtr = mid + 1, ptr = l;
while (lPtr <= mid || rPtr <= r)
{
if (lPtr == mid + 1)
{
cpy[ptr++] = toSort[rPtr++];
continue;
}
if (rPtr == r + 1)
{
cpy[ptr++] = toSort[lPtr++];
continue;
}
if (sigmaCMP(toSort[lPtr], toSort[rPtr]))
{
cpy[ptr++] = toSort[lPtr++];
} else
{
cpy[ptr++] = toSort[rPtr++];
}
}
for (int i = l ; i <= r ; ++i)
{
toSort[i] = cpy[i];
}
}
void merge(int l, int r)
{
if (l == r)
{
return;
}
int mid = (l + r) / 2;
merge(l, mid);
merge(mid + 1, r);
int lPtr = l, rPtr = mid + 1, ptr = l;
while (lPtr <= mid || rPtr <= r)
{
if (lPtr == mid + 1)
{
cpy[ptr++] = toSort[rPtr++];
continue;
}
if (rPtr == r + 1)
{
cpy[ptr++] = toSort[lPtr++];
continue;
}
if (cmp(toSort[lPtr], toSort[rPtr]))
{
cpy[ptr++] = toSort[lPtr++];
} else
{
cpy[ptr++] = toSort[rPtr++];
}
}
for (int i = l ; i <= r ; ++i)
{
toSort[i] = cpy[i];
}
}
std::mt19937 rng(69420);
void allValues(int N, int W, int *res)
{
n = N; w = W;
if (W == 2*N)
{
std::iota(toSort, toSort + n, 0);
sigmaMerge(0, n - 1);
for (int i = 0 ; i < n ; ++i)
{
res[toSort[i]] = i + 1;
}
} else {
std::iota(toSort, toSort + n, 0);
std::shuffle(toSort, toSort + n, rng);
std::fill(knownValues, knownValues + n, 0);
int c = 7;
for (int i = 1 ; i <= c ; ++i)
{
while (true)
{
int pos;
do pos = rng() % n;
while (knownValues[pos]);
std::vector <int> b(n, 0);
b[pos] = i;
std::vector <int> r = play(b);
if (r[pos] > b[pos])
{
for (int j = 0 ; j < n ; ++j)
{
if (knownValues[j] == 0 && r[j] == 0)
{
knownValues[j] = i;
break;
}
}
break;
}
}
}
merge(0, n - 1);
for (int i = 0 ; i < n ; ++i)
{
res[toSort[i]] = i + 1;
}
// TODO: Implement Subtask 5 solution here.
// You may leave this block unmodified if you are not attempting this
// subtask.
}
}
Compilation message
In file included from /usr/include/c++/10/cassert:44,
from koala.cpp:5:
koala.cpp: In function 'std::vector<int> play(const std::vector<int>&)':
koala.cpp:18:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
18 | assert(b.size() == n);
| ~~~~~~~~~^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
344 KB |
Output is correct |
2 |
Correct |
4 ms |
344 KB |
Output is correct |
3 |
Correct |
3 ms |
344 KB |
Output is correct |
4 |
Correct |
3 ms |
344 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
11 ms |
344 KB |
Output is correct |
2 |
Correct |
10 ms |
344 KB |
Output is correct |
3 |
Correct |
11 ms |
344 KB |
Output is correct |
4 |
Correct |
11 ms |
344 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
44 ms |
472 KB |
Output is correct |
2 |
Partially correct |
50 ms |
704 KB |
Output is partially correct |
3 |
Correct |
44 ms |
464 KB |
Output is correct |
4 |
Correct |
42 ms |
488 KB |
Output is correct |
5 |
Partially correct |
41 ms |
600 KB |
Output is partially correct |
6 |
Correct |
43 ms |
596 KB |
Output is correct |
7 |
Partially correct |
41 ms |
728 KB |
Output is partially correct |
8 |
Correct |
48 ms |
728 KB |
Output is correct |
9 |
Correct |
46 ms |
488 KB |
Output is correct |
10 |
Correct |
40 ms |
344 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
17 ms |
460 KB |
Output is correct |
2 |
Correct |
26 ms |
512 KB |
Output is correct |
3 |
Correct |
26 ms |
552 KB |
Output is correct |
4 |
Correct |
26 ms |
512 KB |
Output is correct |
5 |
Correct |
24 ms |
456 KB |
Output is correct |
6 |
Correct |
27 ms |
444 KB |
Output is correct |
7 |
Correct |
27 ms |
344 KB |
Output is correct |
8 |
Correct |
25 ms |
344 KB |
Output is correct |
9 |
Correct |
25 ms |
344 KB |
Output is correct |
10 |
Correct |
24 ms |
448 KB |
Output is correct |
11 |
Correct |
25 ms |
344 KB |
Output is correct |
12 |
Correct |
14 ms |
344 KB |
Output is correct |
13 |
Correct |
27 ms |
432 KB |
Output is correct |
14 |
Correct |
25 ms |
460 KB |
Output is correct |
15 |
Correct |
22 ms |
344 KB |
Output is correct |
16 |
Correct |
22 ms |
344 KB |
Output is correct |
17 |
Correct |
24 ms |
344 KB |
Output is correct |
18 |
Correct |
23 ms |
344 KB |
Output is correct |
19 |
Correct |
24 ms |
344 KB |
Output is correct |
20 |
Correct |
25 ms |
344 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Partially correct |
15 ms |
344 KB |
Output is partially correct |
2 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
3 |
Partially correct |
18 ms |
344 KB |
Output is partially correct |
4 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
5 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
6 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
7 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
8 |
Partially correct |
15 ms |
344 KB |
Output is partially correct |
9 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
10 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
11 |
Partially correct |
15 ms |
344 KB |
Output is partially correct |
12 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
13 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
14 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
15 |
Partially correct |
16 ms |
344 KB |
Output is partially correct |
16 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
17 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
18 |
Partially correct |
14 ms |
460 KB |
Output is partially correct |
19 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
20 |
Partially correct |
14 ms |
356 KB |
Output is partially correct |
21 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
22 |
Partially correct |
14 ms |
448 KB |
Output is partially correct |
23 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
24 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
25 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
26 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
27 |
Partially correct |
14 ms |
452 KB |
Output is partially correct |
28 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
29 |
Partially correct |
16 ms |
344 KB |
Output is partially correct |
30 |
Partially correct |
15 ms |
344 KB |
Output is partially correct |
31 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |
32 |
Partially correct |
16 ms |
456 KB |
Output is partially correct |
33 |
Partially correct |
16 ms |
596 KB |
Output is partially correct |
34 |
Partially correct |
15 ms |
456 KB |
Output is partially correct |
35 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
36 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
37 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
38 |
Partially correct |
14 ms |
344 KB |
Output is partially correct |
39 |
Partially correct |
15 ms |
456 KB |
Output is partially correct |
40 |
Partially correct |
13 ms |
344 KB |
Output is partially correct |