답안 #288421

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
288421 2020-09-01T13:31:09 Z stoyan_malinin 최후의 만찬 (IOI12_supper) C++14
0 / 100
214 ms 22512 KB
#include "advisor.h"

#include <set>
#include <map>
#include <queue>
#include <vector>
#include <iostream>

using namespace std;

namespace Advisor
{
    const int MAXN = 1e5 + 5;
    int maxLog;

    int nxtSame[MAXN], firstSeen[MAXN];
    vector <int> numSeq[MAXN];

    void init(int n, int *a, int k)
    {
        for(int i = 0;i<k;i++)
        {
            for(int bit = 0;bit<=maxLog;bit++)
                numSeq[i].push_back(((i>>bit)&1));
        }

        map <int, int> last;
        for(int i = 0;i<n;i++)
        {
            last[i] = n;
            firstSeen[i] = n;
        }
        for(int i = n-1;i>=0;i--)
        {
            nxtSame[i] = last[ a[i] ];
            last[ a[i] ] = i;

            firstSeen[ a[i] ] = i;
        }
    }

    int calcLog(int x)
    {
        int ans = 0;
        while(x!=1) x /= 2, ans++;

        return ans;
    }

    template <class T>
    T getLast(set <T> &s)
    {
        auto it = s.end();

        it--;
        return *it;
    }

};

void ComputeAdvice(int *C, int N, int K, int M)
{
    using namespace Advisor;
    maxLog = calcLog(K);
    init(N, C, K);

    set <pair <int, int>> s;
    vector <int> colorPos(N), scaffold(K);

    vector <int> activated(N, -1);

    for(int i = 0;i<N;i++)
    {
        colorPos[i] = -1;
    }
    for(int i = 0;i<K;i++)
    {
        scaffold[i] = i;
        colorPos[i] = i;
        s.insert({firstSeen[i], i});
    }

    vector <int> outScaffold(K, 0), outArr(N, 0);
    for(int i = 0;i<N;i++)
    {
        //cout << " --- " << i << " --- " << '\n';

        if(colorPos[ C[i] ]!=-1)
        {
            if(activated[ C[i] ]==-1) outScaffold[ C[i] ] = 1;
            else outArr[ activated[ C[i] ] ] = 1;

            s.erase({i, colorPos[ C[i] ]});
            s.insert({nxtSame[i], colorPos[ C[i] ]});

            continue;
        }

        //for(pair <int, int> item: s) cout << item.first << " " << item.second << " || ";
        //cout << '\n';

        pair <int, int> best = getLast(s);
        s.erase(best);

        //cout << best.first << " " << best.second << " -> " << scaffold[ best.second ] << '\n';

        colorPos[ scaffold[best.second] ] = -1;
        scaffold[best.second] = C[i];
        colorPos[ C[i] ] = best.second;

        //for(int bit: numSeq[best.second]) WriteAdvice(bit);
        s.insert({nxtSame[i], best.second});

        activated[ C[i] ] = i;
    }

    //for(int x: outScaffold) cout << x << " ";
    //cout << '\n';

    //for(int x: outArr) cout << x << " ";
    //cout << '\n';

    for(int x: outScaffold) WriteAdvice(x);
    for(int x: outArr) WriteAdvice(x);
}
#include "assistant.h"

#include <set>
#include <queue>
#include <vector>
#include <iostream>

using namespace std;

namespace Assitant
{
    const int MAXN = 1e5 + 5;
    int maxLog;

    int calcLog(int x)
    {
        int ans = 0;
        while(x!=1) x /= 2, ans++;

        return ans;
    }

    struct Reader
    {
        queue <int> q;

        Reader(){}
        Reader(int n, unsigned char *a)
        {
            for(int i = 0;i<n;i++)
                this->q.push(int(a[i]));
        }

        int readInt(int log2)
        {
            int x = 0;
            for(int bit = 0;bit<=log2;bit++)
            {
                int d = q.front();
                q.pop();

                x += (d<<bit);
            }

            return x;
        }
    };
};

void Assist(unsigned char *A, int N, int K, int R)
{
    vector <int> scaffoldActive(K), arrActive(N);

    for(int i = 0;i<K;i++) scaffoldActive[i] = A[i];
    for(int i = 0;i<N;i++) arrActive[i] = A[i+K];

    set <int> passive, scaffold;
    for(int i = 0;i<K;i++)
    {
        scaffold.insert(i);

        if(scaffoldActive[i]==0)
            passive.insert(i);
    }

    for(int iter = 0;iter<N;iter++)
    {
        int col = GetRequest();
        if(scaffold.count(col)==true) continue;

        //cout << "passive: ";
        //for(int x: passive) cout << x << " ";
        //cout << '\n';

        int toRemove = *passive.begin();
        passive.erase(toRemove);
        PutBack(toRemove);

        scaffold.insert(col);
        if(arrActive[iter]==0) passive.insert(col);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 5376 KB Output is correct
2 Incorrect 2 ms 5376 KB Error - Putting back a color that is not on the scaffold
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 17 ms 6944 KB Error - Putting back a color that is not on the scaffold
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 158 ms 18928 KB Error - Putting back a color that is not on the scaffold
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 6144 KB Error - Putting back a color that is not on the scaffold
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 191 ms 21488 KB Error - Putting back a color that is not on the scaffold
2 Incorrect 207 ms 22000 KB Error - Putting back a color that is not on the scaffold
3 Incorrect 214 ms 22256 KB Error - Putting back a color that is not on the scaffold
4 Incorrect 201 ms 22512 KB Error - Putting back a color that is not on the scaffold
5 Incorrect 202 ms 22256 KB Error - Putting back a color that is not on the scaffold
6 Incorrect 197 ms 22256 KB Error - Putting back a color that is not on the scaffold
7 Incorrect 206 ms 22256 KB Error - Putting back a color that is not on the scaffold
8 Incorrect 205 ms 22256 KB Error - Putting back a color that is not on the scaffold
9 Incorrect 205 ms 22256 KB Error - Putting back a color that is not on the scaffold
10 Incorrect 177 ms 22512 KB Error - Putting back a color that is not on the scaffold