55512023-07-24 18:22:47Valaki2Széfnyitáscpp17Elfogadva 100/1004ms4824 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
 
int n;
 
struct subset {
    vector<bool> inout;
    subset() {
        inout.assign(1 + n, false);
    }
    bool operator < (const subset & other) const {
        return inout < other.inout;
    }
};
 
subset DEF;
 
struct ansrow {
    int b;
    int t[2];
};
 
int k;
vector<int> a;
vector<vector<int> > s;
map<subset, int> sbs; // subsets
vector<ansrow> ans;
 
subset step(subset nodes, bool bit) {
    subset res = DEF;
    for(int i = 1; i <= n; i++) {
        if(nodes.inout[i]) {
            res.inout[s[i][bit]] = true;
        }
    }
    return res;
}
 
pair<bool, int> create_for(subset nodes) {
    int partialresult = sbs[nodes];
    /*cout << "???: ";
    for(int i = 1; i <= n; i++) {
        cout << nodes.inout[i];
    }
    cout << "\n";*/
    if(partialresult) {
        return mp(false, partialresult);
    }
    int idx = ans.size();
    sbs[nodes] = idx;
    ans.pb(ansrow());
    return mp(true, idx);
}
 
void solve_for(subset nodes, int idx) {
    vector<bool> has(2, false);
    for(int i = 1; i <= n; i++) {
        if(nodes.inout[i]) {
            has[a[i]] = true;
        }
    }
    if(!has[0] && !has[1]) {
        exit(1);
    }
    if(has[0] && has[1]) {
        bool which = false;
        subset with_0 = DEF;
        subset with_1 = DEF;
        for(int i = 1; i <= n; i++) {
            if(nodes.inout[i]) {
                if(a[i] == 0) {
                    with_0.inout[i] = true;
                } else if(a[i] == 1) {
                    with_1.inout[i] = true;
                }
            }
        }
        //cout << idx << " " << with_0.inout[1] << with_0.inout[2] << with_1.inout[1] << with_1.inout[2] << "!!!\n";
        ans[idx].b = which;
        subset nw0 = step(with_0, which);
        pair<bool, int> res0 = create_for(nw0);
        //cout << "res: " << res0.fi << " " << res0.se << "\n";
        ans[idx].t[false] = res0.se;
        if(res0.fi) {
            solve_for(nw0, res0.se);
        }
        subset nw1 = step(with_1, which);
        pair<bool, int> res1 = create_for(nw1);
        ans[idx].t[true] = res1.se;
        if(res1.fi) {
            solve_for(nw1, res1.se);
        }
    } else {
        bool which = has[1];
        subset nw = step(nodes, which);
        pair<bool, int> res = create_for(nw);
        ans[idx] = {which, res.se, res.se};
        if(res.fi) {
            solve_for(nw, res.se);
        }
    }
}
 
void solve() {
    cin >> n;
    DEF.inout.assign(1 + n, false);
    a.assign(1 + n, 0);
    s.assign(1 + n, vector<int> (2, 0));
    for(int i = 1; i <= n; i++) {
        cin >> a[i] >> s[i][0] >> s[i][1];
    }
    cin >> k;
    subset all = DEF;
    for(int i = 1; i <= n; i++) {
        all.inout[i] = true;
    }
    //cout << all.inout.size() << "\n";
    ans.resize(1);
    create_for(all);
    solve_for(all, 1);
    cout << (ans.size() - 1) << " " << 1 << "\n";
    for(int i = 1; i < ans.size(); i++) {
        cout << ans[i].b << " " << ans[i].t[0] << " " << ans[i].t[1] << "\n";
    }
}
 
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}
 
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1888 KiB
2Elfogadva3ms1952 KiB
subtask216/16
3Elfogadva3ms2168 KiB
4Elfogadva3ms2388 KiB
5Elfogadva3ms2604 KiB
6Elfogadva3ms3088 KiB
7Elfogadva3ms3032 KiB
8Elfogadva3ms3240 KiB
9Elfogadva3ms3328 KiB
10Elfogadva2ms3368 KiB
11Elfogadva3ms3472 KiB
12Elfogadva3ms3704 KiB
13Elfogadva3ms3736 KiB
subtask324/24
14Elfogadva3ms3812 KiB
15Elfogadva3ms3828 KiB
16Elfogadva2ms3840 KiB
17Elfogadva2ms3836 KiB
18Elfogadva3ms3976 KiB
19Elfogadva3ms4064 KiB
20Elfogadva3ms4220 KiB
21Elfogadva3ms4180 KiB
subtask423/23
22Elfogadva3ms4304 KiB
23Elfogadva2ms4396 KiB
24Elfogadva3ms4404 KiB
25Elfogadva3ms4492 KiB
26Elfogadva3ms4508 KiB
27Elfogadva3ms4780 KiB
28Elfogadva3ms4324 KiB
29Elfogadva3ms4420 KiB
subtask537/37
30Elfogadva3ms2168 KiB
31Elfogadva3ms2388 KiB
32Elfogadva3ms2604 KiB
33Elfogadva3ms3088 KiB
34Elfogadva3ms3032 KiB
35Elfogadva3ms3240 KiB
36Elfogadva3ms3328 KiB
37Elfogadva2ms3368 KiB
38Elfogadva3ms3472 KiB
39Elfogadva3ms3704 KiB
40Elfogadva3ms3736 KiB
41Elfogadva3ms3812 KiB
42Elfogadva3ms3828 KiB
43Elfogadva2ms3840 KiB
44Elfogadva2ms3836 KiB
45Elfogadva3ms3976 KiB
46Elfogadva3ms4064 KiB
47Elfogadva3ms4220 KiB
48Elfogadva3ms4180 KiB
49Elfogadva3ms4304 KiB
50Elfogadva2ms4396 KiB
51Elfogadva3ms4404 KiB
52Elfogadva3ms4492 KiB
53Elfogadva3ms4508 KiB
54Elfogadva3ms4780 KiB
55Elfogadva3ms4324 KiB
56Elfogadva3ms4420 KiB
57Elfogadva3ms4460 KiB
58Elfogadva3ms4540 KiB
59Elfogadva3ms4632 KiB
60Elfogadva3ms4708 KiB
61Elfogadva4ms4736 KiB
62Elfogadva4ms4716 KiB
63Elfogadva4ms4668 KiB
64Elfogadva4ms4792 KiB
65Elfogadva4ms4812 KiB
66Elfogadva4ms4812 KiB
67Elfogadva4ms4820 KiB
68Elfogadva4ms4824 KiB