Submission #1237725

#TimeUsernameProblemLanguageResultExecution timeMemory
1237725pcpLast supper (IOI12_supper)C++20
26 / 100
197 ms72400 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;
}



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;
}







void ComputeAdvice(int *C, int N, int K, int M) {
  queue<int> lastc[N];
  int slots2[N];
  
  memset(slots2, -1, sizeof slots2);

  priority_queue<pair<int,int>> kiwi;

  for (int i = 0; i<N;++i)lastc[C[i]].push(i);
  
  for (int i = 0 ; i < K; ++i){
    if (lastc[i].size()>0)kiwi.push({lastc[i].front(),i});
    else kiwi.push({N+1,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();


      int c2 = it.second;


      int slot = slots2[c2];

      //cout<<it.first<<" "<<it.second<<" "<<kiwi.size()<<endl;
      //cout<<kiwi.top().first<<" "<<kiwi.top().second<<" "<<kiwi.size()<<endl;


      string t_write = getstuff(slot, K);
      //cout<<t_write<<endl;
      for (char x : t_write){
        if (x=='0')WriteAdvice(0);
        if (x=='1')WriteAdvice(1);
      }


      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 <algorithm>


#include "assistant.h"


using namespace std;

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







void Assist(unsigned char *A, int N, int K, int R) {
  int slots[N];
  int slot2[N];

  
  
  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){

      int slot=0;


      for (int j = p*globallen; j < (p+1)*globallen;++j){
        if (A[j]!=0)slot+=pow(2, (p+1)*globallen - j - 1);
      }


      //cout<<slot<<endl;
      ++p;
      //reverse(adv.begin(),adv.end());
      //cout<<adv<<endl;
      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...