답안 #768109

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
768109 2023-06-27T13:15:34 Z boris_mihov 최후의 만찬 (IOI12_supper) C++17
40 / 100
329 ms 16168 KB
#include "advisor.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <queue>
#include <set>

typedef long long llong;
const int MAXN = 100000 + 10;
const int MAXLOG = 17;
const int INF  = 1e9;

int n, k;
struct BIT
{
    int tree[MAXN];
    void update(int idx, int val)
    {
        for (int pos = idx ; pos <= n ; pos += pos & (-pos))
        {
            tree[pos] += val;
        }
    }

    int query(int idx)
    {
        int res = 0;
        for (int pos = idx ; pos > 0 ; pos -= pos & (-pos))
        {
            res += tree[pos];
        }

        return res;
    }
    
    int findKth(int k)
    {
        int pos = 0;
        for (int log = MAXLOG - 1 ; log >= 0 ; --log)
        {
            if (pos + (1 << log) <= n && tree[pos + (1 << log)] < k)
            {
                pos += (1 << log);
                k -= tree[pos];
            }
        }

        return pos + 1;
    }
};

int logK;
int c[MAXN];
bool in[MAXN];
int last[MAXN];
int last2[MAXN];
int next[MAXN];
std::set <std::pair <int,int>> pq;
BIT tree;

void ComputeAdvice(int *C, int N, int K, int M) 
{
    n = N;
    k = K;
    while ((1 << logK + 1) <= n) logK++;

    for (int i = 1 ; i <= n ; ++i)
    {
        last[i] = n + 1;
    }

    for (int i = n ; i >= 1 ; --i)
    {
        c[i] = C[i - 1] + 1;
        next[i] = last[c[i]];
        last[c[i]] = i;
    }

    for (int i = 1 ; i <= k ; ++i)
    {
        in[i] = true;
        last2[i] = last[i];
        pq.insert({last[i], i});
        tree.update(i, 1);
    }

    for (int i = 1 ; i <= n ; ++i)
    {
        if (in[c[i]])
        {
            pq.erase(pq.find({last2[c[i]], c[i]}));
            last2[c[i]] = next[i];
            pq.insert({next[i], c[i]});
            continue;
        }

        auto [val, col] = *(pq.rbegin());
        pq.erase(pq.find(*pq.rbegin()));
        int curr = tree.query(col);

        for (int bit = logK ; bit >= 0 ; --bit)
        {
            WriteAdvice((col & (1 << bit)) > 0);
        }

        tree.update(col, -1);
        tree.update(c[i], 1);
        in[col] = false;
        in[c[i]] = true;
        pq.insert({next[i], c[i]});
        last2[c[i]] = next[i];
    }
}
#include "assistant.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <queue>

typedef long long llong;
const int MAXN = 100000 + 10;
const int MAXLOG = 17;
const int INF  = 1e9;

int N, K;
struct BIT2
{
    int tree[MAXN];
    void update(int idx, int val)
    {
        for (int pos = idx ; pos <= N ; pos += pos & (-pos))
        {
            tree[pos] += val;
        }
    }

    int query(int idx)
    {
        int res = 0;
        for (int pos = idx ; pos > 0 ; pos -= pos & (-pos))
        {
            res += tree[pos];
        }

        return res;
    }
    
    int findKth(int k)
    {
        int pos = 0;
        for (int log = MAXLOG - 1 ; log >= 0 ; --log)
        {
            if (pos + (1 << log) <= N && tree[pos + (1 << log)] < k)
            {
                pos += (1 << log);
                k -= tree[pos];
            }
        }

        return pos + 1;
    }
};

int logK2;
bool in2[MAXN];
BIT2 tree2;

void Assist(unsigned char *A, int _N, int _K, int R) 
{
    N = _N; K = _K;
    while ((1 << logK2 + 1) <= N) logK2++;
    for (int i = 1 ; i <= K ; ++i)
    {
        in2[i] = true;
        tree2.update(i, 1);
    }

    int ptr = 0;
    for (int i = 1 ; i <= N ; ++i)
    {
        int curr = GetRequest() + 1;
        if (in2[curr])
        {
            continue;
        }

        int toRemove = 0;

        for (int j = 0 ; j <= logK2 ; ++j)
        {
            toRemove *= 2;
            assert(A[ptr] == 0 || A[ptr] == 1);
            toRemove += A[ptr++];
        }

        // toRemove = tree2.findKth(toRemove);
        PutBack(toRemove - 1);
        tree2.update(toRemove, -1);
        tree2.update(curr, 1);
        in2[toRemove] = false;
        in2[curr] = true;        
    }
}

Compilation message

advisor.cpp: In function 'void ComputeAdvice(int*, int, int, int)':
advisor.cpp:67:23: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   67 |     while ((1 << logK + 1) <= n) logK++;
      |                  ~~~~~^~~
advisor.cpp:101:13: warning: unused variable 'curr' [-Wunused-variable]
  101 |         int curr = tree.query(col);
      |             ^~~~

assistant.cpp: In function 'void Assist(unsigned char*, int, int, int)':
assistant.cpp:60:24: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   60 |     while ((1 << logK2 + 1) <= N) logK2++;
      |                  ~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 512 KB Output is correct
2 Correct 0 ms 512 KB Output is correct
3 Correct 1 ms 652 KB Output is correct
4 Correct 5 ms 964 KB Output is correct
5 Correct 13 ms 1212 KB Output is correct
6 Correct 12 ms 1160 KB Output is correct
7 Correct 3 ms 960 KB Output is correct
8 Correct 10 ms 1176 KB Output is correct
9 Correct 12 ms 1180 KB Output is correct
10 Correct 6 ms 1132 KB Output is correct
11 Correct 8 ms 1128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 1544 KB Output is correct
2 Correct 89 ms 5668 KB Output is correct
3 Correct 191 ms 14004 KB Output is correct
4 Correct 293 ms 16168 KB Output is correct
5 Correct 251 ms 15536 KB Output is correct
6 Correct 222 ms 13764 KB Output is correct
7 Correct 193 ms 12528 KB Output is correct
8 Correct 183 ms 12656 KB Output is correct
9 Correct 329 ms 15664 KB Output is correct
10 Correct 167 ms 12148 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 139 ms 9240 KB Output is correct
2 Correct 178 ms 12244 KB Output is correct
3 Correct 164 ms 12200 KB Output is correct
4 Correct 160 ms 11744 KB Output is correct
5 Correct 143 ms 10312 KB Output is correct
6 Correct 168 ms 12340 KB Output is correct
7 Correct 176 ms 12096 KB Output is correct
8 Correct 238 ms 15144 KB Output is correct
9 Correct 103 ms 10016 KB Output is correct
10 Correct 201 ms 12452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 768 KB Error - advice is too long
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 176 ms 11280 KB Output is partially correct - 875347 bits used
2 Correct 173 ms 11200 KB Output is partially correct - 841041 bits used
3 Correct 191 ms 11076 KB Output is partially correct - 807466 bits used
4 Correct 166 ms 11236 KB Output is partially correct - 806939 bits used
5 Correct 178 ms 11196 KB Output is partially correct - 805358 bits used
6 Correct 180 ms 11076 KB Output is partially correct - 807109 bits used
7 Correct 163 ms 11088 KB Output is partially correct - 805902 bits used
8 Correct 176 ms 11204 KB Output is partially correct - 808452 bits used
9 Correct 172 ms 11032 KB Output is partially correct - 807874 bits used
10 Correct 220 ms 13816 KB Output is partially correct - 1266636 bits used