#include "advisor.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <queue>
#include <set>
typedef long long llong;
const int MAXN = 100000 + 10;
const int MAXLOG = 17;
const int INF = 1e9;
int n, k;
struct BIT
{
int tree[MAXN];
void update(int idx, int val)
{
for (int pos = idx ; pos <= n ; pos += pos & (-pos))
{
tree[pos] += val;
}
}
int query(int idx)
{
int res = 0;
for (int pos = idx ; pos > 0 ; pos -= pos & (-pos))
{
res += tree[pos];
}
return res;
}
int findKth(int k)
{
int pos = 0;
for (int log = MAXLOG - 1 ; log >= 0 ; --log)
{
if (pos + (1 << log) <= n && tree[pos + (1 << log)] < k)
{
pos += (1 << log);
k -= tree[pos];
}
}
return pos + 1;
}
};
int logK;
int c[MAXN];
bool in[MAXN];
int last[MAXN];
int last2[MAXN];
int next[MAXN];
std::set <std::pair <int,int>> pq;
BIT tree;
void ComputeAdvice(int *C, int N, int K, int M)
{
n = N;
k = K;
while ((1 << logK + 1) <= n) logK++;
for (int i = 1 ; i <= n ; ++i)
{
last[i] = n + 1;
}
for (int i = n ; i >= 1 ; --i)
{
c[i] = C[i - 1] + 1;
next[i] = last[c[i]];
last[c[i]] = i;
}
for (int i = 1 ; i <= k ; ++i)
{
in[i] = true;
last2[i] = last[i];
pq.insert({last[i], i});
tree.update(i, 1);
}
for (int i = 1 ; i <= n ; ++i)
{
if (in[c[i]])
{
pq.erase(pq.find({last2[c[i]], c[i]}));
last2[c[i]] = next[i];
pq.insert({next[i], c[i]});
continue;
}
auto [val, col] = *(pq.rbegin());
pq.erase(pq.find(*pq.rbegin()));
int curr = tree.query(col);
for (int bit = logK ; bit >= 0 ; --bit)
{
WriteAdvice((col & (1 << bit)) > 0);
}
tree.update(col, -1);
tree.update(c[i], 1);
in[col] = false;
in[c[i]] = true;
pq.insert({next[i], c[i]});
last2[c[i]] = next[i];
}
}
#include "assistant.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <queue>
typedef long long llong;
const int MAXN = 100000 + 10;
const int MAXLOG = 17;
const int INF = 1e9;
int N, K;
struct BIT2
{
int tree[MAXN];
void update(int idx, int val)
{
for (int pos = idx ; pos <= N ; pos += pos & (-pos))
{
tree[pos] += val;
}
}
int query(int idx)
{
int res = 0;
for (int pos = idx ; pos > 0 ; pos -= pos & (-pos))
{
res += tree[pos];
}
return res;
}
int findKth(int k)
{
int pos = 0;
for (int log = MAXLOG - 1 ; log >= 0 ; --log)
{
if (pos + (1 << log) <= N && tree[pos + (1 << log)] < k)
{
pos += (1 << log);
k -= tree[pos];
}
}
return pos + 1;
}
};
int logK2;
bool in2[MAXN];
BIT2 tree2;
void Assist(unsigned char *A, int _N, int _K, int R)
{
N = _N; K = _K;
while ((1 << logK2 + 1) <= N) logK2++;
for (int i = 1 ; i <= K ; ++i)
{
in2[i] = true;
tree2.update(i, 1);
}
int ptr = 0;
for (int i = 1 ; i <= N ; ++i)
{
int curr = GetRequest() + 1;
if (in2[curr])
{
continue;
}
int toRemove = 0;
for (int j = 0 ; j <= logK2 ; ++j)
{
toRemove *= 2;
assert(A[ptr] == 0 || A[ptr] == 1);
toRemove += A[ptr++];
}
// toRemove = tree2.findKth(toRemove);
PutBack(toRemove - 1);
tree2.update(toRemove, -1);
tree2.update(curr, 1);
in2[toRemove] = false;
in2[curr] = true;
}
}
Compilation message
advisor.cpp: In function 'void ComputeAdvice(int*, int, int, int)':
advisor.cpp:67:23: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
67 | while ((1 << logK + 1) <= n) logK++;
| ~~~~~^~~
advisor.cpp:101:13: warning: unused variable 'curr' [-Wunused-variable]
101 | int curr = tree.query(col);
| ^~~~
assistant.cpp: In function 'void Assist(unsigned char*, int, int, int)':
assistant.cpp:60:24: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
60 | while ((1 << logK2 + 1) <= N) logK2++;
| ~~~~~~^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
512 KB |
Output is correct |
2 |
Correct |
0 ms |
512 KB |
Output is correct |
3 |
Correct |
1 ms |
652 KB |
Output is correct |
4 |
Correct |
5 ms |
964 KB |
Output is correct |
5 |
Correct |
13 ms |
1212 KB |
Output is correct |
6 |
Correct |
12 ms |
1160 KB |
Output is correct |
7 |
Correct |
3 ms |
960 KB |
Output is correct |
8 |
Correct |
10 ms |
1176 KB |
Output is correct |
9 |
Correct |
12 ms |
1180 KB |
Output is correct |
10 |
Correct |
6 ms |
1132 KB |
Output is correct |
11 |
Correct |
8 ms |
1128 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
1544 KB |
Output is correct |
2 |
Correct |
89 ms |
5668 KB |
Output is correct |
3 |
Correct |
191 ms |
14004 KB |
Output is correct |
4 |
Correct |
293 ms |
16168 KB |
Output is correct |
5 |
Correct |
251 ms |
15536 KB |
Output is correct |
6 |
Correct |
222 ms |
13764 KB |
Output is correct |
7 |
Correct |
193 ms |
12528 KB |
Output is correct |
8 |
Correct |
183 ms |
12656 KB |
Output is correct |
9 |
Correct |
329 ms |
15664 KB |
Output is correct |
10 |
Correct |
167 ms |
12148 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
139 ms |
9240 KB |
Output is correct |
2 |
Correct |
178 ms |
12244 KB |
Output is correct |
3 |
Correct |
164 ms |
12200 KB |
Output is correct |
4 |
Correct |
160 ms |
11744 KB |
Output is correct |
5 |
Correct |
143 ms |
10312 KB |
Output is correct |
6 |
Correct |
168 ms |
12340 KB |
Output is correct |
7 |
Correct |
176 ms |
12096 KB |
Output is correct |
8 |
Correct |
238 ms |
15144 KB |
Output is correct |
9 |
Correct |
103 ms |
10016 KB |
Output is correct |
10 |
Correct |
201 ms |
12452 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
768 KB |
Error - advice is too long |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
176 ms |
11280 KB |
Output is partially correct - 875347 bits used |
2 |
Correct |
173 ms |
11200 KB |
Output is partially correct - 841041 bits used |
3 |
Correct |
191 ms |
11076 KB |
Output is partially correct - 807466 bits used |
4 |
Correct |
166 ms |
11236 KB |
Output is partially correct - 806939 bits used |
5 |
Correct |
178 ms |
11196 KB |
Output is partially correct - 805358 bits used |
6 |
Correct |
180 ms |
11076 KB |
Output is partially correct - 807109 bits used |
7 |
Correct |
163 ms |
11088 KB |
Output is partially correct - 805902 bits used |
8 |
Correct |
176 ms |
11204 KB |
Output is partially correct - 808452 bits used |
9 |
Correct |
172 ms |
11032 KB |
Output is partially correct - 807874 bits used |
10 |
Correct |
220 ms |
13816 KB |
Output is partially correct - 1266636 bits used |