제출 #1338815

#제출 시각아이디문제언어결과실행 시간메모리
1338815QuocSensei저장 (Saveit) (IOI10_saveit)C++20
50 / 100
73 ms7732 KiB
#include <bits/stdc++.h>

#define ll long long 
#define el cout << endl
#define BIT(n) ((1ll) << (n))
#define bit(mask, i) (((mask) >> (i)) & 1)

using namespace std;

void encode_bit(int b);

namespace ENCODER
{
    const int maxn = 1e3;
    const int maxh = 36;
    const int maxlog = __lg(maxn);

    int dist[maxh + 10][maxn + 10], n, h, par[maxh + 10][maxn + 10];
    vector<int> adj[maxn + 10];

    void bfs(int source)
    {
        for (int i = 0; i < n; i++)
            dist[source][i] = -1;
        queue<int> q;
        dist[source][source] = 0;
        q.push(source);

        while (q.size())
        {
            int top = q.front();
            q.pop();
            for (int next_top : adj[top])
            {
                if (dist[source][next_top] != -1)
                    continue;
                dist[source][next_top] = dist[source][top] + 1;
                par[source][next_top] = top;
                q.push(next_top);
            }
        }
    }

    void encode(int _N, int _H, int P, int A[], int B[])
    {
        n = _N;
        h = _H;
        for (int i = 0; i < P; i++)
        {
            adj[A[i]].push_back(B[i]);
            adj[B[i]].push_back(A[i]);
        }
        for (int i = 0; i < h; i++)
        {
            bfs(i);
            for (int j = 0; j < n; j++)
            {
                if (i == j)
                    continue;
                // cout << i << ' ' << par[i][j] << ' ' << j, el;
                for (int k = maxlog; k >= 0; k--)
                    encode_bit(bit(par[i][j], k));
            }
        }
    }
}

void encode(int _N, int _H, int P, int A[], int B[])
{
    ENCODER::encode(_N, _H, P, A, B);
}
#include <bits/stdc++.h>

#define ll long long 
#define el cout << endl
#define BIT(n) ((1ll) << (n))
#define bit(mask, i) (((mask) >> (i)) & 1)

using namespace std;

int decode_bit();
void hops(int h, int c, int d);

namespace DECODER
{
    const int maxn = 1e3;
    const int maxh = 36;
    const int maxlog = __lg(maxn);

    int n, h, dist[maxn + 10];
    vector<int> adj[maxn + 10];

    void dfs(int top)
    {
        for (int next_top : adj[top])
        {
            dist[next_top] = dist[top] + 1;
            dfs(next_top);
        }
    }
    void decode(int _N, int _H)
    {
        n = _N;
        h = _H;
        for (int x = 0; x < h; x++)
        {
            for (int i = 0; i < n; i++)
                adj[i].clear();
            for (int i = 0; i < n; i++)
            {
                if (i == x)
                    continue;
                int y = 0;
                for (int j = maxlog; j >= 0; j--)
                    y += BIT(j) * decode_bit();
                if (y == i)
                    continue;
                // cout << x << ' ' << y << ' ' << i, el;
                adj[y].push_back(i);
            }
            dist[x] = 0;
            dfs(x);
            for (int i = 0; i < n; i++)
                hops(x, i, dist[i]);
        }
    }
}

void decode(int _N, int _H)
{
    DECODER::decode(_N, _H);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...