54062023-05-12 17:05:22szilSzéfnyitáscpp14Accepted 100/1008ms6268 KiB
#include <bits/stdc++.h>

using ll = long long;
using namespace std;
const ll INF = 1e18;

const int MAXN = 151;

int s[MAXN][2], s2[50001][2], a[MAXN], b[50001];
bool bits[MAXN];

int timer;
struct Node {
    Node *p[2] = {nullptr, nullptr};
    int u = -1, t;
};

Node *root;

void add(vector<int> &v, int u) {
    Node *ptr = root;
    for (int i : v) {
        if (ptr->p[i] == nullptr) {
            ptr->p[i] = new Node();
            ptr->p[i]->t = timer++;
        }
        ptr = ptr->p[i];
    }
    ptr->u = u;
}

void upd(Node *v, int d = 0) {
    b[v->t] = bits[d];
    if (v->u != -1) {
        s2[v->t][0] = s2[v->t][1] = v->u;
        return;
    }
    if (v->p[0] != nullptr) {
        s2[v->t][0] = v->p[0]->t;
        upd(v->p[0], d + 1);
    }
    if (v->p[1] != nullptr) {
        s2[v->t][1] = v->p[1]->t;
        upd(v->p[1], d + 1);
    }
}

int main()
{
    srand(time(0));
    ios::sync_with_stdio(0); cin.tie(0);
    int n, k; cin >> n;
    timer = n + 1;
    root = new Node();
    root->t = timer++;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> a[i] >> s[i][0] >> s[i][1];
    }
    cin >> k;

    if (n <= 3) {
        b[1] = 0;
        b[2] = 1;

        for (int i = 1; i <= 2; i++) {
            for (int j = 1; j <= 2; j++) {
                for (int c = 1; c <= 2; c++) {
                    for (int d = 1; d <= 2; d++) {
                        s2[1][0] = i;
                        s2[1][1] = j;
                        s2[2][0] = c;
                        s2[2][1] = d;
                        bool g = true;
                        for (int start = 1; start <= n && g; start++) {
                            int left = k;
                            int stB = 1;
                            int st = start;
                            for (int it = 0; it <= 10; it++) {
                                int o1 = a[st];
                                int o2 = b[stB];
                                if (o1 != o2) {
                                    if (left == 0) {
                                        g = false;
                                        break;
                                    }
                                    left--;
                                }
                                st = s[st][o2];
                                stB = s2[stB][o1];
                            }
                        }

                        if (g) {
                            cout << "2 1\n";
                            cout << b[1] << " " << s2[1][0] << " " << s2[1][1] << "\n" << b[2] << " " << s2[2][0] << " " << s2[2][1] << "\n";
                            return 0;
                        }
                    }
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        bits[i] = rand() % 2;
    }

    for (int i = 1; i <= n; i++) {
        vector<int> v;
        int u = i;
        for (int it = 0; it < n-1; it++) {
            v.push_back(a[u]);
            u = s[u][bits[it]];
        }
        add(v, s[u][bits[n-1]]);
    }
    upd(root);
    cout << timer-1 << " " << n+1 << "\n";
    for (int i = 1; i <= n; i++) {
        cout << a[i] << " " << s[i][0] << " " << s[i][1] << "\n";
    }
    for (int i = n+1; i < timer; i++) {
        if (s2[i][0] == 0) s2[i][0] = s2[i][1];
        if (s2[i][1] == 0) s2[i][1] = s2[i][0];
        if (s2[i][0] == 0) {
            s2[i][0] = s2[i][1] = 1;
        }
        cout << b[i] << " " << s2[i][0] << " " << s2[i][1] << "\n";
    }
    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms2016 KiB
2Accepted3ms2076 KiB
subtask216/16
3Accepted3ms2076 KiB
4Accepted3ms2260 KiB
5Accepted3ms2488 KiB
6Accepted3ms2696 KiB
7Accepted3ms2912 KiB
8Accepted3ms3116 KiB
9Accepted3ms3196 KiB
10Accepted3ms3324 KiB
11Accepted3ms3548 KiB
12Accepted2ms3620 KiB
13Accepted3ms3708 KiB
14Accepted2ms3620 KiB
subtask324/24
15Accepted2ms3620 KiB
16Accepted3ms3636 KiB
17Accepted3ms3664 KiB
18Accepted3ms3908 KiB
19Accepted3ms4228 KiB
20Accepted3ms4440 KiB
21Accepted3ms4420 KiB
22Accepted3ms4420 KiB
23Accepted3ms4428 KiB
subtask423/23
24Accepted3ms4428 KiB
25Accepted3ms4456 KiB
26Accepted3ms4464 KiB
27Accepted3ms4728 KiB
28Accepted3ms4788 KiB
29Accepted3ms4760 KiB
30Accepted3ms4808 KiB
31Accepted3ms4864 KiB
32Accepted3ms4920 KiB
subtask537/37
33Accepted3ms4920 KiB
34Accepted3ms2260 KiB
35Accepted3ms2488 KiB
36Accepted3ms2696 KiB
37Accepted3ms2912 KiB
38Accepted3ms3116 KiB
39Accepted3ms3196 KiB
40Accepted3ms3324 KiB
41Accepted3ms3548 KiB
42Accepted2ms3620 KiB
43Accepted3ms3708 KiB
44Accepted2ms3620 KiB
45Accepted3ms3636 KiB
46Accepted3ms3664 KiB
47Accepted3ms3908 KiB
48Accepted3ms4228 KiB
49Accepted3ms4440 KiB
50Accepted3ms4420 KiB
51Accepted3ms4420 KiB
52Accepted3ms4428 KiB
53Accepted3ms4456 KiB
54Accepted3ms4464 KiB
55Accepted3ms4728 KiB
56Accepted3ms4788 KiB
57Accepted3ms4760 KiB
58Accepted3ms4808 KiB
59Accepted3ms4864 KiB
60Accepted3ms4920 KiB
61Accepted4ms5048 KiB
62Accepted6ms5780 KiB
63Accepted6ms5664 KiB
64Accepted7ms5884 KiB
65Accepted7ms6140 KiB
66Accepted8ms6268 KiB
67Accepted7ms6024 KiB
68Accepted7ms6120 KiB
69Accepted7ms6072 KiB
70Accepted7ms6136 KiB
71Accepted8ms6164 KiB
72Accepted7ms5992 KiB