Submission #259206

#TimeUsernameProblemLanguageResultExecution timeMemory
259206SamAndLast supper (IOI12_supper)C++17
100 / 100
936 ms13808 KiB
#include "advisor.h"
//#include "grader.h"
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define fi first
#define se second
const int MAXN = 100005;

void ComputeAdvice(int *C, int N, int K, int M)
{
    int h[MAXN] = {};
    int hl[MAXN] = {};
    int u[MAXN] = {};
    int d[MAXN] = {};
    int ans[MAXN] = {};
    bool ps[MAXN] = {};
    bool p[MAXN] = {};

    for (int i = 0; i < N; ++i)
        u[i] = N;
    for (int i = N - 1; i >= 0; --i)
    {
        h[i] = u[C[i]];
        u[C[i]] = i;
    }

    set<int> s;
    for (int i = 0; i < K; ++i)
        s.insert(i);
    set<pair<int, int> > ss;
    for (int i = 0; i < K; ++i)
        ss.insert(m_p(u[i], i));

    for (int i = 0; i < N; ++i)
        u[i] = -1;
    for (int i = 0; i < N; ++i)
    {
        hl[i] = u[C[i]];
        u[C[i]] = i;
    }

    for (int i = 0; i < K; ++i)
        d[i] = i + 1;
    for (int i = 0; i < N; ++i)
    {
        if (s.find(C[i]) != s.end())
        {
            if (hl[i] == -1)
                ps[C[i]] = true;
            else
            {
                p[hl[i]] = true;
            }
            ss.erase(m_p(i, C[i]));
            ss.insert(m_p(h[i], C[i]));
            continue;
        }
        int x = (--ss.end())->se;
        ss.erase((--ss.end()));
        ss.insert(m_p(h[i], C[i]));
        s.erase(x);
        s.insert(C[i]);
        ans[i] = d[x];
        d[C[i]] = d[x];
    }

    for (int i = 0; i < K; ++i)
    {
        WriteAdvice(ps[i]);
    }
    for (int i = 0; i < N; ++i)
    {
        WriteAdvice(p[i]);
    }
    return;

    int l = 0;
    while ((1 << l) < K)
        ++l;

    for (int i = 0; i < N; ++i)
    {
        if (ans[i] == 0)
            continue;
        --ans[i];
        for (int j = 0; j < l; ++j)
        {
            if ((ans[i] & (1 << j)))
                WriteAdvice(1);
            else
                WriteAdvice(0);
        }
    }
}
#include "assistant.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;

void Assist(unsigned char *A, int N, int K, int R)
{
    int d[MAXN] = {};
    bool p[MAXN] = {};

    int l = 0;
    while ((1 << l) < K)
        ++l;

    int j = 0;
    for (int i = 0; i < K; ++i)
    {
        d[i] = i;
        p[i] = A[j++];
    }
    set<int> s;
    for (int i = 0; i < K; ++i)
        s.insert(i);

    for (int i = 0; i < N; ++i)
    {
        int x = GetRequest();
        if (s.find(x) != s.end())
        {
            for (int u = 0; u < K; ++u)
            {
                if (d[u] == x)
                {
                    p[u] = A[j++];
                    break;
                }
            }
            continue;
        }
        for (int u = 0; u < K; ++u)
        {
            if (!p[u])
            {
                s.erase(d[u]);
                s.insert(x);
                PutBack(d[u]);
                d[u] = x;
                p[u] = A[j++];
                break;
            }
        }
    }
}
#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...