#include "advisor.h"
#include <bits/stdc++.h>
#define maxn 100005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int Lim;
int n;
void insert_number(int x) {
for (int i = 0; i < Lim; i++) WriteAdvice(x>>i&1);
}
vector<int> nho[maxn];
int bit[maxn];
void upd(int u, int d) {
for (int i = u; i <= n; i += i & -i) bit[i] += d;
}
int get(int u) {
int kq = 0;
for (int i = u; i > 0; i -= i & -i) kq += bit[i];
return kq;
}
void ComputeAdvice(int *C, int N, int K, int M) {
Lim = __lg(K)+1; n = N;
for (int i = 0; i < N; i++) nho[i].emplace_back(INT_MAX);
for (int i = N-1; i>=0;i--) nho[C[i]].emplace_back(i);
set<ii> q;
for (int i = 0; i < K; i++) {
upd(i+1, 1);
q.insert(ii{nho[i].back(), i});
}
for (int o = 0; o < N; o++) {
int cur = C[o];
auto it = q.find(ii{nho[cur].back(), cur});
if (it != q.end()) {
q.erase(ii{nho[cur].back(), cur});
nho[cur].pop_back();
q.insert(ii{nho[cur].back(), cur});
continue;
}
auto [TIME, COLOR] = *q.rbegin();
nho[cur].pop_back();
insert_number(get(COLOR+1));
upd(COLOR+1, -1);
q.erase(ii{TIME, COLOR});
q.insert(ii{nho[cur].back(), cur});
upd(cur+1, 1);
}
}
/*
4 2 100
2 0 3 0
*/
#include "assistant.h"
#include <bits/stdc++.h>
#define maxn 400005
using namespace std;
int _Lim, _n;
int st[4*maxn];
void upd(int u, int d, int r = 1, int lo = 0, int hi = _n-1) {
if (lo == hi) {
st[r] = d;
return;
}
int mid = (lo + hi) >> 1;
if (u <= mid) upd(u, d, r<<1, lo, mid);
else upd(u, d, r<<1|1, mid+1, hi);
st[r] = st[r<<1] + st[r<<1|1];
}
int get(int u, int v, int r = 1, int lo = 0, int hi = _n-1) {
if (u <= lo && hi <= v) return st[r];
int mid = (lo + hi) >> 1;
return (u <= mid ? get(u, v, r<<1, lo, mid) : 0) +
(v > mid ? get(u, v, r<<1|1, mid+1, hi) : 0);
}
int bfind(int d, int r = 1, int lo = 0, int hi = _n-1) {
if (lo == hi) return lo;
int mid = (lo + hi) >> 1, trai = st[r<<1];
return d > trai ? bfind(d-trai, r<<1|1, mid+1, hi) : bfind(d, r<<1, lo, mid);
}
void Assist(unsigned char *A, int N, int K, int R) {
_Lim = __lg(K) + 1; _n = N;
for (int i = 0; i < K; i++)
upd(i, 1);
int orz = 0;
for (int step = 0; step < N; step++) {
int cur = GetRequest();
if (get(cur, cur)) continue;
int num = 0;
for (int i = orz; i < orz+_Lim; i++)
num += ((A[i]) << (i-orz));
orz += _Lim;
int T = bfind(num);
PutBack(T);
upd(T, 0);
upd(cur, 1);
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |