제출 #1330477

#제출 시각아이디문제언어결과실행 시간메모리
1330477DeltaStructLast supper (IOI12_supper)C++20
100 / 100
134 ms6100 KiB
#include <bits/stdc++.h>
using namespace std;
#include "advisor.h"

void ComputeAdvice(int *A,int n,int m,int q){
  vector<int> B(n,n),C(n);
  for (int i(n-1);i > -1;--i){
    C[i] = B[A[i]];
    B[A[i]] = i;
  }
  vector<int> R(n+m),E(m); iota(E.begin(),E.end(),0);
  multiset<tuple<int,int,int>,greater<tuple<int,int,int>>> M; set<int> S;
  for (int i(0);i < m;++i) M.emplace(B[i],i,i),S.emplace(i);
  for (int i(0);i < n;++i) if (!S.contains(A[i])){
    auto [a,b,c] = *M.begin(); M.erase(M.begin()),S.erase(c);
    R[E[b]] = 1,E[b] = m+i,M.emplace(C[i],b,A[i]),S.emplace(A[i]);
  } else {
    auto [a,b,c] = *M.rbegin(); M.erase(prev(M.end()));
    E[b] = m+i,M.emplace(C[i],b,A[i]);
  }
  for (int i(0);i < n+m;++i) WriteAdvice(R[i]);
}
#include <bits/stdc++.h>
using namespace std;
#include "assistant.h"

void Assist(unsigned char *A,int n,int m,int q){
  vector<int> B(m),C(n+m); iota(B.begin(),B.end(),0),iota(C.begin(),C.begin()+m,0);
  set<int> S(B.begin(),B.end()),T;
  for (int i(0);i < m;++i) if (A[i]) T.emplace(i);
  for (int i(0);i < n;++i){
    int x = GetRequest(); C[m+i] = x;
    if (A[m+i]) T.emplace(m+i);
    if (S.contains(x)) continue;
    PutBack(C[*T.begin()]),S.erase(C[*T.begin()]),T.erase(T.begin());
    S.emplace(x);
  }
}
#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...