Submission #401815

#TimeUsernameProblemLanguageResultExecution timeMemory
401815JasiekstrzLast supper (IOI12_supper)C++17
100 / 100
273 ms17260 KiB
#include<bits/stdc++.h>
#include "advisor.h"
#define fi first
#define se second
using namespace std;
const int NN=1e5;
int tmpnxt[NN+10];
int nxt[NN+10];
int en[NN+10];
bool useful[NN+10];
vector<int> can_rm[NN+10];
set<pair<int,int>> pq;
set<int> st;
set<int> okrm2;
set<int> nokrm2;
void ComputeAdvice(int *C,int N,int K,int M)
{
	for(int i=0;i<N;i++)
		tmpnxt[i]=N;
	for(int i=N-1;i>=0;i--)
	{
		nxt[i]=tmpnxt[C[i]];
		tmpnxt[C[i]]=i;
	}
	for(int i=0;i<K;i++)
		pq.insert({tmpnxt[i],i});
	for(int i=0;i<N;i++)
	{
		if(pq.find({i,C[i]})!=pq.end())
			en[i]=-1;
		else
		{
			en[i]=(prev(pq.end())->se);
			pq.erase(prev(pq.end()));
			pq.insert({i,C[i]});
		}
		tmpnxt[C[i]]=nxt[i];
		pq.erase({i,C[i]});
		pq.insert({nxt[i],C[i]});
	}
	for(auto v:pq)
		st.insert(v.se);
	for(int i=N-1;i>=0;i--)
	{
		if(en[i]==-1)
		{
			if(!useful[C[i]])
			{
				can_rm[C[i]].push_back(i);
				useful[C[i]]=true;
			}
		}
		else
		{
			if(!useful[C[i]])
				can_rm[C[i]].push_back(i);
			st.erase(C[i]);
			st.insert(en[i]);
			useful[en[i]]=false;
		}
	}
	for(int i=0;i<K;i++)
	{
		if(!useful[i])
			can_rm[i].push_back(-1);
		okrm2.insert(i);
	}
	for(int i=0;i<N;i++)
	{
		if(nokrm2.find(C[i])!=nokrm2.end())
		{
			nokrm2.erase(C[i]);
			okrm2.insert(C[i]);
			continue;
		}
		else if(okrm2.find(C[i])!=okrm2.end())
			continue;
		while(true)
		{
			int v=(*okrm2.begin());
			okrm2.erase(v);
			if(can_rm[v].back()<i)
			{
				WriteAdvice(1);
				can_rm[v].pop_back();
				break;
			}
			WriteAdvice(0);
			nokrm2.insert(v);
		}
		okrm2.insert(C[i]);
	}
	return;
}

#include<bits/stdc++.h>
#include "assistant.h"
#define fi first
#define se second
using namespace std;
const int NN=1e5;
set<int> okrm;
set<int> nokrm;
void Assist(unsigned char *A,int N,int K,int R)
{
	//for(int i=0;i<R;i++)
	//	cerr<<(int)A[i]<<" ";
	//cerr<<"\n";
	int it=0;
	for(int i=0;i<K;i++)
		okrm.insert(i);
	for(int qi=1;qi<=N;qi++)
	{
		int x=GetRequest();
		if(nokrm.find(x)!=nokrm.end())
		{
			nokrm.erase(x);
			okrm.insert(x);
			continue;
		}
		else if(okrm.find(x)!=okrm.end())
			continue;
		// must put back
		for(;A[it]==0;it++)
		{
			nokrm.insert(*okrm.begin());
			okrm.erase(okrm.begin());
		}
		it++;
		PutBack(*okrm.begin());
		okrm.erase(okrm.begin());
		okrm.insert(x);
	}
	return;
}
#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...