Submission details
Task:Yhdistelmät
Sender:jhuun
Submission time:2025-11-29 18:22:25 +0200
Language:C++ (C++17)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
#40
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3, 4details
#2ACCEPTED0.00 s1, 3, 4details
#30.00 s1, 4details
#40.00 s1, 4details
#5ACCEPTED0.00 s1, 4details
#60.00 s1, 4details
#70.00 s1, 4details
#8ACCEPTED0.00 s1, 4details
#9ACCEPTED0.00 s1, 4details
#10ACCEPTED0.00 s1, 4details
#110.00 s2, 3, 4details
#120.01 s3, 4details
#130.00 s4details
#140.01 s4details
#15ACCEPTED0.01 s4details
#16ACCEPTED0.02 s4details
#17ACCEPTED0.03 s4details
#180.00 s1, 2, 3, 4details
#19ACCEPTED0.00 s1, 2, 3, 4details
#200.03 s4details
#21ACCEPTED0.00 s4details

Code

#include <bits/stdc++.h>

#define FORL(l_) for (items_t L = l_; L; L = incr(L))

using items_t = __uint128_t;
using comb_t = std::pair<items_t, uint64_t>;

int n, m;
items_t BL;
int64_t BS;
std::vector<int64_t> P;
std::vector<comb_t> C;

items_t to_iidx(int i) {
    return items_t{1} << i;
}

bool has(items_t l, items_t i) {
    return (l & i) == i;
}

items_t missing(items_t l, items_t i) {
    return ~l & i;
}

items_t incr(__uint128_t i) {
    return i ^ (i & -i);
}

int next(items_t i) {
    const auto lsb = static_cast<uint64_t>(i);
    const auto msb = static_cast<uint64_t>(i >> 64);
    return lsb ? __builtin_ctzll(lsb) : 64 + __builtin_ctzll(msb);
}

int64_t cost(items_t l) {
    int64_t c = 0;
    FORL(l) {
        c += P[next(L)];
    }
    return c;
}

int count(items_t l) {
    int res = 0;
    FORL(l) {
        ++res;
    }
    return res;
}

void print(items_t l) {
    FORL(l) {
        std::cout << next(L) + 1 << ' ';
    }
    std::cout << '\n';
}

std::tuple<items_t, items_t, int64_t> find_ba(items_t c, items_t l, int64_t s) {
    items_t bc = 0;
    items_t bl = 0;
    int64_t bs = std::numeric_limits<int>::min();
    for (std::size_t idx = 0; idx < C.size(); ++idx) {
        const auto& [i, p] = C[idx];
        if (has(l, i)) {
            continue;
        }
        int64_t sn = s + p - cost(missing(l, i));
        const items_t ln = l | i;
        items_t cn = c | to_iidx(idx);
        FORL(~cn) {
            const auto ci = static_cast<std::size_t>(next(L));
            if (ci >= C.size()) {
                break;
            }
            const auto& [i2, p2] = C[ci];
            if (has(ln, i2)) {
                sn += p2;
                cn |= to_iidx(ci);
            }
        }
        if (sn > bs) {
            bc = cn;
            bl = ln;
            bs = sn;
        }
    }
    return {bc, bl, bs};
}

void solve(items_t c, items_t l, int64_t s) {
    for (bool cont = true; cont; ) {
        if (s > BS) {
            BS = s;
            BL = l;
        }
        cont = false;
        const auto ba = find_ba(c, l, s);
        if (const auto [bac, bal, bas] = ba; bas >= s) {
            cont = true;
            c = bac;
            l = bal;
            s = bas;
        }
    }
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);
    std::cin >> n >> m;
    P.resize(n);
    for (auto& p : P) {
        std::cin >> p;
    }
    for (auto i = 0; i < m; ++i) {
        comb_t c{};
        int k;
        std::cin >> k >> c.second;
        for (auto j = 0; j < k; ++j) {
            int kj;
            std::cin >> kj;
            c.first |= to_iidx(kj - 1);
        }
        if (const int64_t score = c.second - cost(missing(BL, c.first)); score >= 0) {
            BS += score;
            BL |= c.first;
        } else {
            C.push_back(std::move(c));
        }
    }
    for (bool cont = true; cont; ) {
        cont = false;
        for (std::size_t i = 0; !cont && i < C.size(); ++i) {
            const auto& [ii, ip] = C[i];
            if (const int64_t score = ip - cost(missing(BL, ii)); score >= 0) {
                BS += score;
                BL |= ii;
                cont = true;
                std::swap(C[i], C.back());
                C.pop_back();
            }
            for (auto j = i + 1; !cont && j < C.size(); ++j) {
                const auto& [ji, jp] = C[j];
                if (const int64_t score = ip + jp - cost(missing(BL, ii | ji)); score >= 0) {
                    BS += score;
                    BL |= ii | ji;
                    cont = true;
                    std::swap(C[j], C.back());
                    C.pop_back();
                    std::swap(C[i], C.back());
                    C.pop_back();
                }
                for (auto k = j + 1; !cont && k < C.size(); ++k) {
                    const auto& [ki, kp] = C[k];
                    if (const int64_t score = ip + jp + kp - cost(missing(BL, ii | ji | ki)); score >= 0) {
                        BS += score;
                        BL |= ii | ji | ki;
                        cont = true;
                        std::swap(C[k], C.back());
                        C.pop_back();
                        std::swap(C[j], C.back());
                        C.pop_back();
                        std::swap(C[i], C.back());
                        C.pop_back();
                    }
                }
            }
        }
    }

    const auto bs = BS;
    const auto bl = BL;
    for (std::size_t i = 0; i < C.size(); ++i) {
        solve(to_iidx(i), bl | C[i].first, bs + C[i].second - cost(missing(bl, C[i].first)));
    }
    if (BS > 0) {
        std::cout << BS << '\n';
        std::cout << count(BL) << '\n';
        print(BL);
    } else {
        std::cout << "0\n";
    }
}

Test details

Test 1

Group: 1, 2, 3, 4

Verdict: ACCEPTED

input
20 20
80 69 91 47 74 75 94 22 100 43...

correct output
446
11
2 3 5 8 10 13 14 15 17 19 20 

user output
446
11
2 3 5 8 10 13 14 15 17 19 20 

Test 2

Group: 1, 3, 4

Verdict: ACCEPTED

input
20 20
5 42 7 18 55 64 64 83 73 44 22...

correct output
425
11
1 2 3 4 7 10 13 16 18 19 20 

user output
425
11
1 2 3 4 7 10 13 16 18 19 20 

Test 3

Group: 1, 4

Verdict:

input
20 20
30 98 55 69 40 3 95 12 64 56 3...

correct output
284
8
1 3 8 10 15 16 18 19 

user output
202
12
1 3 5 8 10 12 13 15 16 18 19 2...

Test 4

Group: 1, 4

Verdict:

input
20 20
11 44 58 8 16 52 20 43 24 31 4...

correct output
348
10
2 4 5 7 11 13 15 16 18 20 

user output
346
11
2 4 5 7 11 13 14 15 16 18 20 

Test 5

Group: 1, 4

Verdict: ACCEPTED

input
20 20
53 44 5 37 88 36 81 47 85 97 3...

correct output
119
13
1 2 4 8 10 11 13 14 16 17 18 1...

user output
119
13
1 2 4 8 10 11 13 14 16 17 18 1...

Test 6

Group: 1, 4

Verdict:

input
20 20
20 27 75 94 48 62 37 55 49 67 ...

correct output
478
11
1 2 5 7 10 12 13 15 16 17 18 

user output
347
17
1 2 3 4 5 7 8 9 10 12 13 15 16...

Test 7

Group: 1, 4

Verdict:

input
20 20
32 28 67 72 32 76 53 30 47 67 ...

correct output
215
10
2 4 5 7 8 9 11 13 16 20 

user output
204
13
2 3 4 5 7 8 9 11 12 13 15 16 2...

Test 8

Group: 1, 4

Verdict: ACCEPTED

input
20 20
39 72 74 79 49 45 73 44 37 4 7...

correct output
185
13
1 3 5 6 7 8 10 13 14 16 17 18 ...

user output
185
11
1 3 7 8 10 13 14 16 17 18 20 

Test 9

Group: 1, 4

Verdict: ACCEPTED

input
20 20
41 56 65 78 2 13 17 42 83 76 9...

correct output
95
11
2 4 5 6 7 8 13 14 17 18 19 

user output
95
11
2 4 5 6 7 8 13 14 17 18 19 

Test 10

Group: 1, 4

Verdict: ACCEPTED

input
20 20
43 1 20 61 25 46 2 18 36 1 85 ...

correct output
111
8
1 2 3 7 8 10 16 19 

user output
111
8
1 2 3 7 8 10 16 19 

Test 11

Group: 2, 3, 4

Verdict:

input
100 100
992248 852673 366775 737068 56...

correct output
30642743
46
3 5 6 9 11 12 15 16 17 18 21 2...

user output
29288981
55
3 5 6 7 9 11 12 13 14 15 16 17...

Test 12

Group: 3, 4

Verdict:

input
100 100
153790 361741 45017 47184 9422...

correct output
16529629
39
2 3 4 5 10 12 14 17 24 25 26 3...

user output
14669507
52
2 3 4 5 10 12 13 14 17 19 21 2...

Test 13

Group: 4

Verdict:

input
100 100
186797 446409 957173 150683 17...

correct output
14928280
62
1 2 8 9 10 11 12 14 15 16 17 2...

user output
12435641
74
1 2 5 8 9 10 11 12 13 14 15 16...

Test 14

Group: 4

Verdict:

input
100 100
343213 582494 707357 104682 66...

correct output
11308944
72
1 3 4 5 6 7 8 9 10 11 12 13 14...

user output
8245284
87
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

Test 15

Group: 4

Verdict: ACCEPTED

input
100 100
922546 12088 805566 351521 644...

correct output
3311952
10
14 17 26 29 64 65 70 76 83 95 

user output
3311952
10
14 17 26 29 64 65 70 76 83 95 

Test 16

Group: 4

Verdict: ACCEPTED

input
100 100
923042 35929 531316 587665 845...

correct output
519209
6
2 18 45 61 64 86 

user output
519209
6
2 18 45 61 64 86 

Test 17

Group: 4

Verdict: ACCEPTED

input
100 100
493725 218022 417464 531537 83...

correct output
1255541
11
16 19 24 29 30 50 60 62 67 74 ...

user output
1255541
11
16 19 24 29 30 50 60 62 67 74 ...

Test 18

Group: 1, 2, 3, 4

Verdict:

input
1 1
2
1 1
1

correct output
0
0

user output
0

Test 19

Group: 1, 2, 3, 4

Verdict: ACCEPTED

input
1 1
1
1 2
1

correct output
1
1

user output
1
1

Test 20

Group: 4

Verdict:

input
100 100
1000000 1000000 1000000 100000...

correct output
0
100
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
0

Test 21

Group: 4

Verdict: ACCEPTED

input
100 100
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
99999900
100
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
99999900
100
1 2 3 4 5 6 7 8 9 10 11 12 13 ...