Submission #516183

#TimeUsernameProblemLanguageResultExecution timeMemory
516183600MihneaLast supper (IOI12_supper)C++17
100 / 100
218 ms17052 KiB
#include "advisor.h"
#include <bits/stdc++.h>

using namespace std;


void ComputeAdvice(int *a, int n, int k, int ___) {
  vector<int> solution;
  vector<int> when(n);
  int tt = 0;
  vector<vector<int>> nxt(n, vector<int> (1, n + 1));
  for (int i = n - 1; i >= 0; i--) {
    nxt[a[i]].push_back(i);
  }
  set<int> active_guys;
  set<pair<int, int>> nxt_time;
  for (int i = 0; i < k; i++) {
    active_guys.insert(i);
    nxt_time.insert({nxt[i].back(), i});
  }
  for (int i = 0; i < k; i++) {
    when[i] = tt++;
    solution.push_back(0);
  }
  int rr = 0;
  for (int i = 0; i < n; i++) {
    assert((int) nxt_time.size() == k);
    if (!nxt_time.count({nxt[a[i]].back(), a[i]})) {
      auto it = nxt_time.end(); it--;
      int guy = it->second;
      nxt_time.erase(it);
      nxt_time.insert({nxt[a[i]].back(), a[i]});
      rr++;
    } else {
      solution[when[a[i]]] = 1;
    }

    when[a[i]] = tt++;
    solution.push_back(0);
    nxt[a[i]].pop_back();
    assert(nxt_time.count({i, a[i]}));
    nxt_time.erase({i, a[i]});
    nxt_time.insert({nxt[a[i]].back(), a[i]});
  }
  assert((int) nxt_time.size() == k);
  for (auto &x : solution) {
    WriteAdvice(x);
  }
  return;
  for (auto &x : solution) {
    cout << x << " ";
  }
  cout << "\n";
  exit(0);
  WriteAdvice(0);
  WriteAdvice(1);
  WriteAdvice(2);

}


#include "assistant.h"
#include <bits/stdc++.h>

using namespace std;


void Assist(unsigned char *a, int n, int k, int r) {
  set<int> act, skip;
  int ptr = 0;
  for (int i = 0; i < k; i++) {
    act.insert(i);
    if (a[ptr++] == 0) {
      skip.insert(i);
    }
  }
 //cout << "\t\t\tstart\n";
  for (int i = 0; i < n; i++) {
    int nxt = GetRequest();
    if (!act.count(nxt)) {
      assert(!skip.empty());
      int x = *skip.begin();
      //cout << "\t\t\t" << i << " : " << nxt << ", give " << x << " : " << int(a[ptr]) << " : " << (int) skip.size() << "\n";
      skip.erase(x);
      assert(act.count(x));
      act.erase(x);

      act.insert(nxt);
      assert(ptr < r);
      if (a[ptr++] == 0) {
        skip.insert(nxt);
      }
      PutBack(x);
    } else {
      if (a[ptr++] == 0) {
        skip.insert(nxt);
      }
    }
  }
  //exit(0);
  return;
/**
  int i;
  set<int> give;
  for (int i = )
  for (i = 0; i < n; i++) {
    int req = GetRequest();
    if (req >= k)
      PutBack(req % k);
  }
**/
}

Compilation message (stderr)

advisor.cpp: In function 'void ComputeAdvice(int*, int, int, int)':
advisor.cpp:30:11: warning: unused variable 'guy' [-Wunused-variable]
   30 |       int guy = it->second;
      |           ^~~
#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...