Submission details
Task:Yhdistelmät
Sender:jhuun
Submission time:2025-11-29 17:05:11 +0200
Language:C++ (C++17)
Status:READY
Result:62
Feedback
groupverdictscore
#1ACCEPTED16
#2ACCEPTED17
#3ACCEPTED29
#40
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3, 4details
#2ACCEPTED0.00 s1, 3, 4details
#3ACCEPTED0.00 s1, 4details
#4ACCEPTED0.00 s1, 4details
#5ACCEPTED0.00 s1, 4details
#6ACCEPTED0.00 s1, 4details
#7ACCEPTED0.00 s1, 4details
#8ACCEPTED0.00 s1, 4details
#9ACCEPTED0.00 s1, 4details
#10ACCEPTED0.01 s1, 4details
#11ACCEPTED0.06 s2, 3, 4details
#12ACCEPTED0.06 s3, 4details
#130.05 s4details
#140.04 s4details
#15ACCEPTED0.03 s4details
#16ACCEPTED0.02 s4details
#17ACCEPTED0.02 s4details
#18ACCEPTED0.00 s1, 2, 3, 4details
#19ACCEPTED0.00 s1, 2, 3, 4details
#20ACCEPTED0.01 s4details
#21ACCEPTED0.04 s4details

Code

#include <bits/stdc++.h>

#define FORL(l_) for (auto 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) {
    auto 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 auto ln = l | i;
        auto cn = c | to_iidx(idx);
        FORL(~cn) {
            const auto ci = next(L);
            if (ci >= m) {
                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 (auto 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);
        }
        C.push_back(std::move(c));
    }
    for (auto i = 0; i < m; ++i) {
        solve(to_iidx(i), C[i].first, C[i].second - cost(C[i].first));
    }
    std::cout << BS << '\n';
    std::cout << count(BL) << '\n';
    print(BL);
}

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: ACCEPTED

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
284
7
1 3 8 10 15 18 19 

Test 4

Group: 1, 4

Verdict: ACCEPTED

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
348
10
2 4 5 7 11 13 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: ACCEPTED

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
478
11
1 2 5 7 10 12 13 15 16 17 18 

Test 7

Group: 1, 4

Verdict: ACCEPTED

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
215
10
2 4 5 7 8 9 11 13 16 20 

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: ACCEPTED

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
30642743
46
3 5 6 9 11 12 15 16 17 18 21 2...

Test 12

Group: 3, 4

Verdict: ACCEPTED

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
16529629
39
2 3 4 5 10 12 14 17 24 25 26 3...

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
14718040
55
1 2 8 9 10 11 14 15 16 17 20 2...

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
10828870
66
1 3 4 5 6 7 8 10 11 12 14 17 1...

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: ACCEPTED

input
1 1
2
1 1
1

correct output
0
0

user output
0
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: ACCEPTED

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
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 ...