Submission #547174

#TimeUsernameProblemLanguageResultExecution timeMemory
547174JesusLast supper (IOI12_supper)C++14
43 / 100
280 ms78496 KiB
#include<bits/stdc++.h> #include "advisor.h" using namespace std; int andamio[100001]; queue<int> rep[100001]; pair<int,int> st[400010]; void st_i(int j,int i=0,int pos=1){ if(i==j){ int aux=andamio[i]; if(rep[aux].size()>0) { aux=rep[aux].front(); } else aux=100001; st[pos]={aux,aux}; return; } st[pos*2]={-1,1000000}; st[pos*2+1]=st[pos*2]; st_i((i+j)/2,i,pos*2); st_i(j,(i+j)/2+1,pos*2+1); st[pos].first=max(st[pos*2].first,st[pos*2+1].first); st[pos].second=min(st[pos*2].second,st[pos*2+1].second); } int act; void st_ap(int j,int i=0,int pos=1){ if(i==j){ int aux=andamio[i]; if(rep[aux].size()>0) aux=rep[aux].front(); else aux=100001; st[pos]={aux,aux}; return; } if(st[pos*2].second==act) st_ap((i+j)/2,i,pos*2); else st_ap(j,(i+j)/2+1,pos*2+1); st[pos].first=max(st[pos*2].first,st[pos*2+1].first); st[pos].second=min(st[pos*2].second,st[pos*2+1].second); } void st_ag(int j,int i=0,int pos=1){ if(i==j){ int aux=andamio[i]; if(rep[aux].size()>0) aux=rep[aux].front(); else aux=100001; st[pos]={aux,aux}; return; } if(st[pos*2].first==act) st_ag((i+j)/2,i,pos*2); else st_ag(j,(i+j)/2+1,pos*2+1); st[pos].first=max(st[pos*2].first,st[pos*2+1].first); st[pos].second=min(st[pos*2].second,st[pos*2+1].second); } int return_min(int j,int i=0,int pos=1){ if(i==j) return i; else if(st[pos].second==st[pos*2].second) return return_min((i+j)/2,i,pos*2); else return return_min(j,(i+j)/2+1,pos*2+1); } int return_max(int j,int i=0,int pos=1){ if(i==j) return i; else if(st[pos].first==st[pos*2].first) return return_max((i+j)/2,i,pos*2); else return return_max(j,(i+j)/2+1,pos*2+1); } void ComputeAdvice(int *C, int N, int K, int M) { int lim; if(K==1) lim=0; else lim=log2(K-1); int expo[lim+2]; expo[0]=1; for(int i=1;i<=lim;i++){ expo[i]=expo[i-1]*2; } if(expo[lim]*2-1<K-1) { lim++; expo[lim]=expo[lim-1]*2; } for(int i=0;i<N;i++){ if(i<K) andamio[i]=i; rep[C[i]].push(i); } st_i(K-1); for(int i=0;i<N;i++){ if(st[1].second==i){ rep[andamio[return_min(K-1)]].pop(); act=i; st_ap(K-1); } else{ int pos=return_max(K-1); int val=pos; for(int j=lim;j>=0;j--){ if(expo[j]<=val){ WriteAdvice(1); val-=expo[j]; } else WriteAdvice(0); } rep[C[i]].pop(); //cout<<andamio[pos]<<endl; andamio[pos]=C[i]; act=st[1].first; st_ag(K-1); } } }
#include<bits/stdc++.h> #include "assistant.h" using namespace std; bool cont[100001]; int an[100001]; void Assist(unsigned char *A, int N, int K, int R) { int lim; if(K==1) lim=0; else lim=log2(K-1); int expo[lim+2]; expo[0]=1; for(int i=1;i<=lim;i++){ expo[i]=expo[i-1]*2; } if(expo[lim]*2-1<K-1) { lim++; expo[lim]=expo[lim-1]*2; } for(int i=0;i<N;i++){ if(i<K){ cont[i]=true; an[i]=i; } else cont[i]=false; } int pos=0; for(int i=0;i<N;i++){ int req=GetRequest(); if(cont[req]==false){ int val=0; for(int j=lim;j>=0;j--){ if((int)A[pos]==1) val+=expo[j]; pos++; } cont[an[val]]=false; //cout<<an[val]<<endl; PutBack(an[val]); an[val]=req; cont[req]=true; } } }
#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...