Submission #61275

#TimeUsernameProblemLanguageResultExecution timeMemory
61275aomeLast supper (IOI12_supper)C++17
100 / 100
352 ms30416 KiB
#include <bits/stdc++.h>

#include "advisor.h"

using namespace std;

const int maxn = 200005;

int f1[maxn], f2[maxn], f3[maxn];
bool del[maxn];

void ComputeAdvice(int *C, int N, int K, int M) {
	for (int i = 0; i < N; ++i) f1[i] = N;
	for (int i = N - 1; i >= 0; --i) {
		f2[i] = f1[C[i]], f1[C[i]] = i;
	} 
	for (int i = 0; i < K; ++i) f2[i + N] = f1[i];
	set< pair<int, int> > s;
	for (int i = 0; i < N; ++i) f3[i] = -1;
	for (int i = 0; i < K; ++i) {
		f3[i] = i + N, s.insert({f2[i + N], i + N});
	}
	for (int i = 0; i < N; ++i) {
		int &tmp = f3[C[i]];
		set< pair<int, int> > :: iterator it;
		if (tmp == -1) {
			it = --s.end();
			int p = it -> second;
			del[p] = 1;
			if (p > N) f3[p - N] = -1;
			else f3[C[p]] = -1;
		}
		else {
			it = s.find({f2[tmp], tmp});
			assert(it != s.end());
		}
		s.erase(it);
		tmp = i;
		s.insert({f2[i], i});
	}
	for (auto i : s) del[i.second] = 1;
	for (int i = 0; i < N + K; ++i) WriteAdvice(del[i]);
}
#include <bits/stdc++.h>

#include "assistant.h"

using namespace std;

void Assist(unsigned char *A, int N, int K, int R) {
	set<int> s1, s2;
	for (int i = 0; i < K; ++i) {
		s1.insert(i);
		if (A[i + N]) s2.insert(i); 
	}
	for (int i = 0; i < N; ++i) {
		int tmp = GetRequest();
		if (s1.find(tmp) == s1.end()) {
			assert(s2.size());
			int p = *s2.begin();
			assert(s1.find(p) != s1.end());
			s1.erase(p), s2.erase(p);
			PutBack(p);
			s1.insert(tmp);
		}
		if (A[i]) s2.insert(tmp);
	}
}
#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...