This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "advisor.h"
#define F first
#define S second
using namespace std;
const int N = 1e5 + 10;
int n , m , k , ar[N] , lg;
vector <int> pos[N];
struct SEG{
int sum[N << 2];
void Add(int x , int node = 1 , int nl = 0 , int nr = n)
{
sum[node]++;
if(nl + 1 == nr)
return;
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
Add(x , lc , nl , mid);
else
Add(x , rc , mid , nr);
}
void Rem(int x , int node = 1 , int nl = 0 , int nr = n)
{
sum[node]--;
if(nl + 1 == nr)
return;
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
Rem(x , lc , nl , mid);
else
Rem(x , rc , mid , nr);
}
int Get_val(int x , int node = 1 , int nl = 0 , int nr = n)
{
if(nl + 1 == nr)
return nl;
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < sum[lc])
return Get_val(x , lc , nl , mid);
else
return Get_val(x - sum[lc] , rc , mid , nr);
}
int Get_id(int x , int node = 1 , int nl = 0 , int nr = n)
{
if(nl + 1 == nr)
return sum[node];
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
return Get_id(x , lc , nl , mid);
else
return sum[lc] + Get_id(x , rc , mid , nr);
}
bool Ex(int x , int node = 1 , int nl = 0 , int nr = n)
{
if(nl + 1 == nr)
return sum[node];
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
return Ex(x , lc , nl , mid);
else
return Ex(x , rc , mid , nr);
}
} seg;
void Print(int val)
{
for(int i = 0 ; i < lg ; i++)
WriteAdvice(((val >> i) & 1));
}
void ComputeAdvice(int *C, int nn, int kk, int mm) {
n = nn;
k = kk;
m = mm;
lg = 1;
int tmp = 2;
while(tmp < k)
{
lg++;
tmp *= 2;
}
for(int i = 0 ; i < n ; i++)
{
ar[i] = C[i];
pos[i].push_back(n + 1);
}
for(int i = n - 1 ; i > -1 ; i--)
{
pos[ar[i]].push_back(i);
}
set <pair<int , int>> st;
for(int i = 0 ; i < k ; i++)
{
seg.Add(i);
st.insert(make_pair(pos[i].back() , i));
}
for(int i = 0 ; i < n ; i++)
{
if(!seg.Ex(ar[i]))
{
pos[ar[i]].pop_back();
auto it = st.end(); it--; auto now = *it;
st.erase(now);
int id_rem = seg.Get_id(now.S);
id_rem--;
seg.Rem(now.S);
seg.Add(ar[i]);
st.insert(make_pair(pos[ar[i]].back() , ar[i]));
Print(id_rem);
}
else
{
st.erase(make_pair(pos[ar[i]].back() , ar[i]));
pos[ar[i]].pop_back();
st.insert(make_pair(pos[ar[i]].back() , ar[i]));
}
}
}
//
#include <bits/stdc++.h>
#include "assistant.h"
#define F first
#define S second
using namespace std;
const int N = 1e5 + 10;
int n2 , k2 , r2 , lg2;
struct SEG{
int sum[N << 2];
void Add(int x , int node = 1 , int nl = 0 , int nr = n2)
{
sum[node]++;
if(nl + 1 == nr)
return;
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
Add(x , lc , nl , mid);
else
Add(x , rc , mid , nr);
}
void Rem(int x , int node = 1 , int nl = 0 , int nr = n2)
{
sum[node]--;
if(nl + 1 == nr)
return;
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
Rem(x , lc , nl , mid);
else
Rem(x , rc , mid , nr);
}
int Get_val(int x , int node = 1 , int nl = 0 , int nr = n2)
{
if(nl + 1 == nr)
return nl;
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < sum[lc])
return Get_val(x , lc , nl , mid);
else
return Get_val(x - sum[lc] , rc , mid , nr);
}
int Get_id(int x , int node = 1 , int nl = 0 , int nr = n2)
{
if(nl + 1 == nr)
return sum[node];
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
return Get_id(x , lc , nl , mid);
else
return sum[lc] + Get_id(x , rc , mid , nr);
}
bool Ex(int x , int node = 1 , int nl = 0 , int nr = n2)
{
if(nl + 1 == nr)
return sum[node];
int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
if(x < mid)
return Ex(x , lc , nl , mid);
else
return Ex(x , rc , mid , nr);
}
} seg2;
void Assist(unsigned char *ar, int nn, int kk, int rr) {
n2 = nn;
k2 = kk;
r2 = rr;
lg2 = 1;
int tmp = 2;
while(tmp < k2)
{
lg2++;
tmp *= 2;
}
for(int i = 0 ; i < k2 ; i++)
seg2.Add(i);
int pos = 0;
for(int i = 0 ; i < n2 ; i++)
{
int now = GetRequest();
if(seg2.Ex(now))
continue;
int id = 0;
for(int i = 0 ; i < lg2 ; i++)
{
if(ar[pos + i] == '1')
id |= (1 << i);
pos++;
}
id++;
int bd = seg2.Get_val(id);
PutBack(bd);
seg2.Rem(bd);
seg2.Add(now);
}
}
//
# | 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... |