답안 #288428

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
288428 2020-09-01T13:34:19 Z stoyan_malinin 최후의 만찬 (IOI12_supper) C++14
0 / 100
212 ms 21488 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 <assert.h>
#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';

        assert(passive.empty()==false);

        int toRemove = *passive.begin();
        scaffold.erase(toRemove);
        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 Runtime error 3 ms 5376 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 19 ms 6912 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 169 ms 17904 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 11 ms 6144 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 201 ms 20432 KB Execution killed with signal 11
2 Runtime error 207 ms 20720 KB Execution killed with signal 11
3 Runtime error 207 ms 21232 KB Execution killed with signal 11
4 Runtime error 207 ms 21232 KB Execution killed with signal 11
5 Runtime error 212 ms 21232 KB Execution killed with signal 11
6 Runtime error 211 ms 21488 KB Execution killed with signal 11
7 Runtime error 209 ms 21232 KB Execution killed with signal 11
8 Runtime error 209 ms 21232 KB Execution killed with signal 11
9 Runtime error 203 ms 21488 KB Execution killed with signal 11
10 Runtime error 184 ms 21232 KB Execution killed with signal 11