제출 #1237692

#제출 시각아이디문제언어결과실행 시간메모리
1237692pcp최후의 만찬 (IOI12_supper)C++20
0 / 100
170 ms71704 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){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();


      int c2 = it.second;


      int slot = slots2[c2];


      string t_write = getstuff(slot, K);

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



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

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