답안 #336880

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
336880 2020-12-17T06:29:28 Z thecodingwizard 저장 (Saveit) (IOI10_saveit) C++11
100 / 100
264 ms 10980 KB
#include "grader.h"
#include "encoder.h"

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define F0R(i, n) for (int i = 0; i < n; ++i)
#define FOR(i, a, b) for (int i = a; i < b; ++i)
#define pb push_back
#define inf 1000000010
#define ii pair<int, int>
#define f first
#define s second
#define mp make_pair

void sendNum(int x) {
    assert(x <= 1023);
    F0R(i, 10) {
        if (x&(1<<i)) encode_bit(1);
        else encode_bit(0);
    }
}

vector<int> adj[1000];
int pa[1000];
int dist[36][1000];

void dfs(int u, int p) {
    pa[u] = p;
    for (int v : adj[u]) {
        if (pa[v] == -1) dfs(v, u);
    }
}

ll curNum = 0;
int curSz = 0;
ll curMult = 1;

// 59 bits can represent 37 nodes

void flushCodes() {
    if (curSz > 0) {
        F0R(i, 59) {
            if (curNum & (1LL << i)) encode_bit(1);
            else encode_bit(0);
        }
        curNum = 0;
        curSz = 0;
        curMult = 1;
    }
}

void sendCode(int x) {
    if (curSz == 37) flushCodes();
    assert(0 <= x && x <= 2);
    curNum += curMult*x;
    curMult *= 3;
    curSz++;
}

void encode(int n, int h, int e, int *v1, int *v2){
    F0R(i, e) {
        adj[v1[i]].pb(v2[i]);
        adj[v2[i]].pb(v1[i]);
    }
    F0R(i, n) pa[i] = -1;

    dfs(0, 0);

    FOR(i, 1, n) {
        sendNum(pa[i]);
    }

    F0R(i, 36) {
        F0R(j, n) dist[i][j] = inf;
        dist[i][i] = 0;
        queue<int> q; q.push(i);
        while (!q.empty()) {
            int u = q.front(); q.pop();
            for (int v : adj[u]) {
                if (dist[i][v] == inf) {
                    dist[i][v] = dist[i][u]+1;
                    q.push(v);
                }
            }
        }
    }

    F0R(i, h) {
        sendNum(dist[i][0]);
        FOR(j, 1, n) {
            int p = pa[j];
            if (dist[i][j] == dist[i][p]) {
                sendCode(0);
            } else if (dist[i][j] == dist[i][p]+1) {
                sendCode(1);
            } else if (dist[i][j] == dist[i][p]-1) {
                sendCode(2);
            } else {
                cout << i << " " << j << " " << p << endl;
                cout << dist[i][j] << " " << dist[i][p] << endl;
                cerr << "??" << endl;
                exit(1);
            }
        }
        flushCodes();
    }

    return;
}
#include "grader.h"
#include "decoder.h"

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define F0R(i, n) for (int i = 0; i < n; ++i)
#define FOR(i, a, b) for (int i = a; i < b; ++i)
#define pb push_back
#define inf 1000000010
#define ii pair<int, int>
#define f first
#define s second
#define mp make_pair

int ans[1000], codes[1000];
vector<int> children[1000];

int readNum() {
    int n = 0;
    F0R(i, 10) {
        int x = decode_bit();
        if (x) n |= (1 << i);
    }
    return n;
}

void dfs(int u) {
    for (int v : children[u]) {
        int code = codes[v];
        if (code == 0) ans[v] = ans[u];
        else if (code == 1) ans[v] = ans[u]+1;
        else if (code == 2) ans[v] = ans[u]-1;
        else assert(false);
        dfs(v);
    }
}

queue<int> codeQueue;
int readCode() {
    if (codeQueue.size() == 0) {
        ll num = 0;
        F0R(i, 59) {
            int x = decode_bit();
            if (x == 1) num |= (1LL << i);
        }
        F0R(i, 37) {
            codeQueue.push(num%3);
            num /= 3;
        }
    }
    int x = codeQueue.front();
    codeQueue.pop();
    return x;
}

void decode(int n, int h) {
    int pa[1000];

    FOR(i, 1, n) {
        pa[i] = readNum();
        children[pa[i]].pb(i);
    }
    F0R(i, h) {
        ans[0] = readNum();

        FOR(j, 1, n) {
            codes[j] = readCode();
        }
        while (!codeQueue.empty()) codeQueue.pop();

        dfs(0);

        F0R(j, n) {
            hops(i, j, ans[j]);
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 264 ms 10980 KB Output is correct - 67698 call(s) of encode_bit()
2 Correct 3 ms 4868 KB Output is correct - 247 call(s) of encode_bit()
3 Correct 26 ms 5784 KB Output is correct - 62450 call(s) of encode_bit()
4 Correct 2 ms 4864 KB Output is correct - 385 call(s) of encode_bit()
5 Correct 30 ms 5728 KB Output is correct - 62450 call(s) of encode_bit()
6 Correct 41 ms 6256 KB Output is correct - 67698 call(s) of encode_bit()
7 Correct 49 ms 6624 KB Output is correct - 67698 call(s) of encode_bit()
8 Correct 26 ms 5804 KB Output is correct - 65184 call(s) of encode_bit()
9 Correct 28 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
10 Correct 28 ms 5780 KB Output is correct - 67698 call(s) of encode_bit()
11 Correct 36 ms 5908 KB Output is correct - 67698 call(s) of encode_bit()
12 Correct 27 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
13 Correct 61 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
14 Correct 32 ms 5748 KB Output is correct - 67698 call(s) of encode_bit()
15 Correct 37 ms 5856 KB Output is correct - 67698 call(s) of encode_bit()
16 Correct 118 ms 6368 KB Output is correct - 67698 call(s) of encode_bit()
17 Correct 47 ms 6304 KB Output is correct - 67698 call(s) of encode_bit()
18 Correct 60 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
19 Correct 41 ms 6320 KB Output is correct - 67698 call(s) of encode_bit()
20 Correct 77 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
21 Correct 83 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
22 Correct 57 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
23 Correct 84 ms 7164 KB Output is correct - 67698 call(s) of encode_bit()
# 결과 실행 시간 메모리 Grader output
1 Correct 264 ms 10980 KB Output is correct - 67698 call(s) of encode_bit()
2 Correct 3 ms 4868 KB Output is correct - 247 call(s) of encode_bit()
3 Correct 26 ms 5784 KB Output is correct - 62450 call(s) of encode_bit()
4 Correct 2 ms 4864 KB Output is correct - 385 call(s) of encode_bit()
5 Correct 30 ms 5728 KB Output is correct - 62450 call(s) of encode_bit()
6 Correct 41 ms 6256 KB Output is correct - 67698 call(s) of encode_bit()
7 Correct 49 ms 6624 KB Output is correct - 67698 call(s) of encode_bit()
8 Correct 26 ms 5804 KB Output is correct - 65184 call(s) of encode_bit()
9 Correct 28 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
10 Correct 28 ms 5780 KB Output is correct - 67698 call(s) of encode_bit()
11 Correct 36 ms 5908 KB Output is correct - 67698 call(s) of encode_bit()
12 Correct 27 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
13 Correct 61 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
14 Correct 32 ms 5748 KB Output is correct - 67698 call(s) of encode_bit()
15 Correct 37 ms 5856 KB Output is correct - 67698 call(s) of encode_bit()
16 Correct 118 ms 6368 KB Output is correct - 67698 call(s) of encode_bit()
17 Correct 47 ms 6304 KB Output is correct - 67698 call(s) of encode_bit()
18 Correct 60 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
19 Correct 41 ms 6320 KB Output is correct - 67698 call(s) of encode_bit()
20 Correct 77 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
21 Correct 83 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
22 Correct 57 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
23 Correct 84 ms 7164 KB Output is correct - 67698 call(s) of encode_bit()
# 결과 실행 시간 메모리 Grader output
1 Correct 264 ms 10980 KB Output is correct - 67698 call(s) of encode_bit()
2 Correct 3 ms 4868 KB Output is correct - 247 call(s) of encode_bit()
3 Correct 26 ms 5784 KB Output is correct - 62450 call(s) of encode_bit()
4 Correct 2 ms 4864 KB Output is correct - 385 call(s) of encode_bit()
5 Correct 30 ms 5728 KB Output is correct - 62450 call(s) of encode_bit()
6 Correct 41 ms 6256 KB Output is correct - 67698 call(s) of encode_bit()
7 Correct 49 ms 6624 KB Output is correct - 67698 call(s) of encode_bit()
8 Correct 26 ms 5804 KB Output is correct - 65184 call(s) of encode_bit()
9 Correct 28 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
10 Correct 28 ms 5780 KB Output is correct - 67698 call(s) of encode_bit()
11 Correct 36 ms 5908 KB Output is correct - 67698 call(s) of encode_bit()
12 Correct 27 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
13 Correct 61 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
14 Correct 32 ms 5748 KB Output is correct - 67698 call(s) of encode_bit()
15 Correct 37 ms 5856 KB Output is correct - 67698 call(s) of encode_bit()
16 Correct 118 ms 6368 KB Output is correct - 67698 call(s) of encode_bit()
17 Correct 47 ms 6304 KB Output is correct - 67698 call(s) of encode_bit()
18 Correct 60 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
19 Correct 41 ms 6320 KB Output is correct - 67698 call(s) of encode_bit()
20 Correct 77 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
21 Correct 83 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
22 Correct 57 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
23 Correct 84 ms 7164 KB Output is correct - 67698 call(s) of encode_bit()
# 결과 실행 시간 메모리 Grader output
1 Correct 264 ms 10980 KB Output is correct - 67698 call(s) of encode_bit()
2 Correct 3 ms 4868 KB Output is correct - 247 call(s) of encode_bit()
3 Correct 26 ms 5784 KB Output is correct - 62450 call(s) of encode_bit()
4 Correct 2 ms 4864 KB Output is correct - 385 call(s) of encode_bit()
5 Correct 30 ms 5728 KB Output is correct - 62450 call(s) of encode_bit()
6 Correct 41 ms 6256 KB Output is correct - 67698 call(s) of encode_bit()
7 Correct 49 ms 6624 KB Output is correct - 67698 call(s) of encode_bit()
8 Correct 26 ms 5804 KB Output is correct - 65184 call(s) of encode_bit()
9 Correct 28 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
10 Correct 28 ms 5780 KB Output is correct - 67698 call(s) of encode_bit()
11 Correct 36 ms 5908 KB Output is correct - 67698 call(s) of encode_bit()
12 Correct 27 ms 5728 KB Output is correct - 67698 call(s) of encode_bit()
13 Correct 61 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
14 Correct 32 ms 5748 KB Output is correct - 67698 call(s) of encode_bit()
15 Correct 37 ms 5856 KB Output is correct - 67698 call(s) of encode_bit()
16 Correct 118 ms 6368 KB Output is correct - 67698 call(s) of encode_bit()
17 Correct 47 ms 6304 KB Output is correct - 67698 call(s) of encode_bit()
18 Correct 60 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
19 Correct 41 ms 6320 KB Output is correct - 67698 call(s) of encode_bit()
20 Correct 77 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
21 Correct 83 ms 6880 KB Output is correct - 67698 call(s) of encode_bit()
22 Correct 57 ms 6496 KB Output is correct - 67698 call(s) of encode_bit()
23 Correct 84 ms 7164 KB Output is correct - 67698 call(s) of encode_bit()