#include "advisor.h"
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn = 2e5 + 10, maxk = 25005;
int n, k, m;
vector < int > uses[maxn];
vector < int > del[maxn];
int nxt[maxn];
int on_pos[maxn];
int res[maxn], appear[maxn];
void ComputeAdvice(int *C, int N, int K, int M)
{
n = N;
k = K;
m = M;
for (int i = 0; i < n; ++ i)
{
res[i] = 0;
uses[i].pb(1e9);
nxt[i] = 1e9;
}
for (int i = n-1; i >= 0; -- i)
{
uses[C[i]].pb(i);
nxt[C[i]] = i;
}
set < pair < int, int > > s;
for (int i = 0; i < n; ++ i)
on_pos[i] = -1;
for (int i = 0; i < k; ++ i)
{
s.insert(make_pair(nxt[i], i));
on_pos[i] = i;
appear[i] = i;
}
int respos = k;
for (int i = 0; i < n; ++ i)
{
//cout << "i = " << i << endl;
respos = i + k;
if(on_pos[C[i]] != -1)
{
appear[C[i]] = respos;
uses[C[i]].pop_back();
s.erase(make_pair(nxt[C[i]], C[i]));
nxt[C[i]] = uses[C[i]].back();
s.insert(make_pair(nxt[C[i]], C[i]));
continue;
}
pair < int, int > worst = *s.rbegin();
// cout << worst.first << " " << worst.second << endl;
//cout << "here " << endl;
int t = worst.second;
// cout << t << endl;
int pos = on_pos[t];
// cout << pos << endl;
on_pos[t] = -1;
on_pos[C[i]] = pos;
res[appear[t]] = 1;
appear[C[i]] = respos;
// cout << pos << endl;
uses[C[i]].pop_back();
nxt[C[i]] = uses[C[i]].back();
s.erase(s.find(worst));
s.insert(make_pair(nxt[C[i]], C[i]));
}
for (int i = 0; i < n + k; ++ i)
WriteAdvice(res[i]);
return;
}
#include "assistant.h"
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
int taken[200000], active[200000];
void Assist(unsigned char *A, int N, int K, int R)
{
//cout << "assist " << endl;
//cout << R << endl;
for (int i = 0; i < R; ++ i)
{
// cout << "i = " << A[i] << endl;
}
// cout << endl;
int n, k;
n = N;
k = K;
int lg = 0, stepen = 1;
while(stepen*2 <= k)
{
stepen *= 2;
lg ++;
}
for (int i = 0; i < n; ++ i)
{
active[i] = 0;
}
for (int i = 0; i < k; ++ i)
{
taken[i] = i;
active[i] = 1;
}
int i;
int j = 0;
vector < int > inactive;
for (int i = 0; i < k; ++ i)
{
if(A[i])inactive.pb(i);
}
for (i = 0; i < n; i++)
{
j = i + k;
int req = GetRequest();
if (active[req])
{
if(A[j])inactive.pb(req);
continue;
}
int up = inactive.back();
inactive.pop_back();
active[up] = 0;
PutBack(up);
active[req] = 1;
if(A[j])inactive.pb(req);
}
return;
}
# | 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... |