#include "advisor.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 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 next[MAXN];
std::priority_queue <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) <= k) 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;
pq.push({last[i], i});
tree.update(i, 1);
}
for (int i = 1 ; i <= n ; ++i)
{
if (in[c[i]])
{
continue;
}
auto [val, col] = pq.top();
pq.pop();
int curr = tree.query(col);
for (int bit = logK ; bit >= 0 ; --bit)
{
WriteAdvice((curr & (1 << bit)) > 0);
}
tree.update(col, -1);
tree.update(c[i], 1);
in[col] = false;
in[c[i]] = true;
pq.push({next[i], c[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) <= K) 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;
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:65:23: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
65 | while ((1 << logK + 1) <= k) logK++;
| ~~~~~^~~
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) <= K) logK2++;
| ~~~~~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
524 KB |
Output is correct |
2 |
Incorrect |
1 ms |
516 KB |
Output isn't correct - not an optimal way |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
16 ms |
1484 KB |
Output isn't correct - not an optimal way |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
140 ms |
8736 KB |
Output isn't correct - not an optimal way |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
640 KB |
Error - advice is too long |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
187 ms |
10996 KB |
Output isn't correct - not an optimal way |
2 |
Incorrect |
187 ms |
10740 KB |
Output isn't correct - not an optimal way |
3 |
Incorrect |
177 ms |
10384 KB |
Output isn't correct - not an optimal way |
4 |
Incorrect |
182 ms |
10364 KB |
Output isn't correct - not an optimal way |
5 |
Incorrect |
169 ms |
10392 KB |
Output isn't correct - not an optimal way |
6 |
Incorrect |
177 ms |
10624 KB |
Output isn't correct - not an optimal way |
7 |
Incorrect |
177 ms |
10344 KB |
Output isn't correct - not an optimal way |
8 |
Incorrect |
170 ms |
10372 KB |
Output isn't correct - not an optimal way |
9 |
Incorrect |
192 ms |
10532 KB |
Output isn't correct - not an optimal way |
10 |
Correct |
202 ms |
11748 KB |
Output is partially correct - 1117620 bits used |