# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1151047 | KhoaDuy | 최후의 만찬 (IOI12_supper) | C++20 | 0 ms | 0 KiB |
void ComputeAdvice(int *C,int n,int k,int m){
int c[n+k];
for(int i=0;i<n;i++){
c[k+i]=C[i];
}
for(int i=0;i<k;i++){
c[i]=i;
}
int state[n+k]={0};
int last[n];
for(int i=0;i<n;i++){
last[i]=n+k;
}
int nxt[n+k];
for(int i=n+k-1;i>=0;i--){
nxt[i]=last[c[i]];
last[c[i]]=i;
}
set<pair<int,int>> se;
for(int i=0;i<k;i++){
se.insert({nxt[i],i});
}
for(int i=k;i<n+k;i++){
set<pair<int,int>>::iterator it=se.begin();
if((*it).first==i){
se.erase(it);
}
else{
it=se.end();
it--;
state[(*it).second]=1;
se.erase(it);
}
se.insert({nxt[i],i});
}
unsigned char bruh0='0',bruh1='1';
for(int i=0;i<n+k;i++){
if(state[i]==0){
WriteAdvice(bruh0);
}
else{
WriteAdvice(bruh1);
}
}
}
void Assist(unsigned char *A,int n,int k,int r){
string trans="";
assert(r==n+k);
for(int i=0;i<r;i++){
trans+=A[i];
}
set<int> se,se1;
for(int i=0;i<k;i++){
if(trans[i]=='0'){
se.insert(i);
}
else{
se1.insert(i);
}
}
for(int i=k;i<n+k;i++){
int c=GetRequest();
if(se.find(c)!=se.end()){
se.erase(c);
}
else{
set<int>::iterator it=se1.begin();
PutBack((*it));
se1.erase(it);
}
if(trans[i]=='0'){
se.insert(c);
}
else{
se1.insert(c);
}
}
}