Submission #1269591

#TimeUsernameProblemLanguageResultExecution timeMemory
1269591nerrrminLast supper (IOI12_supper)C++20
100 / 100
71 ms10568 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...