Submission #1237677

#TimeUsernameProblemLanguageResultExecution timeMemory
1237677pcpLast supper (IOI12_supper)C++20
0 / 100
140 ms327680 KiB

#include "advisor.h"
#include <iostream>
#include <cstring>
#include <cmath>
#include <bitset>
#include <queue>
#include <string>

using namespace std;

int get_bit_len(int N){
  if (N<=5000)return 14;
  if (N<=25000)return 15;
  return 19;
}

int get_num(string txt){
  int c=0;
  for (int i = txt.size()-1;i>=0;--i){
    int ri = txt.size()-i-1;

    if (txt[i]=='1')c+=pow(2,ri);

  }

  return c;


}

string getstuff(int num, int N){
  const int k = get_bit_len(N);
  string xd;
  if (k==14)xd = bitset<14>(num).to_string();
  if (k==15)xd = bitset<15>(num).to_string();
  if (k==19)xd = bitset<19>(num).to_string();
  return xd;
}

queue<int> lastc[1000010];

int slots2[1000010];



void ComputeAdvice(int *C, int N, int K, int M) {
  memset(slots2, -1, sizeof slots2);

  priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> kiwi;

  for (int i = 0; i<N;++i)lastc[C[i]].push(i);

  for (int i = 0 ; i < K; ++i){kiwi.push({lastc[i].front(),i});slots2[i]=i;}




  for (int i = 0; i <N;++i){

    int c = C[i];

    lastc[c].pop();

    

    if (slots2[c]==-1){

      pair<int,int> it = kiwi.top();kiwi.pop();
      while (it.first <= i || it.second != c){it = kiwi.top();kiwi.pop();}


      int c2 = it.second;


      int slot = slots2[c2];


      string t_write = getstuff(slot, K);

      for (auto x : t_write)WriteAdvice(x);


      slots2[c2]=-1;
      slots2[c]=slot;



    }

    if (lastc[c].size()>0)kiwi.push({lastc[c].front(), c});
    else kiwi.push({N+1, c});

    


    

    


  }




}
#include <cstring>
#include <iostream>
#include <cmath>
#include <string>
#include <queue>


#include "assistant.h"


using namespace std;

int get_bit_len2(int N){
  if (N<=5000)return 14;
  if (N<=25000)return 15;
  return 19;
}

int get_num2(string txt){
  int c=0;
  for (int i = txt.size()-1;i>=0;--i){
    int ri = txt.size()-i-1;

    if (txt[i]=='1')c+=pow(2,ri);

  }

  return c;


}


int globallen;

int slots[1000010];
int slot2[1000010];

void Assist(unsigned char *A, int N, int K, int R) {
  globallen=get_bit_len2(K);

  memset(slots, -1, sizeof slots);memset(slot2, -1, sizeof slot2);

  for (int i = 0 ; i < K;++i){slots[i]=i;slot2[i]=i;}

  int i;
  int p=0;
  for (i = 0; i < N; i++) {
    int req = GetRequest();

    if (slots[req]==-1){

      string adv="";
      for (int j = p*globallen; j < (p+1)*globallen;++j)adv+=A[j];
      ++p;
      int slot = get_num2(adv);
      slots[req]=slot;
      slots[slot2[slot]]=-1;
      PutBack(slot2[slot]);
      slot2[slot]=req;




    }



  }

}
#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...