Submission #17923673


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

void dfs(int N, int M, const vector<vector<int>> &cnt1, vector<int> &cnt2,
            int idx, int sum, int toy)
{
    if (toy == M) {
        cnt2[idx] = sum;
        return;
    }
    dfs(N, M, cnt1, cnt2, idx, sum, toy + 1);
    idx |= (1 << toy);
    sum += cnt1[toy][N];
    dfs(N, M, cnt1, cnt2, idx, sum, toy + 1);
}

int main()
{
    int N, M;
    cin >> N >> M;
    vector<vector<int>> cnt0(M, vector<int>(N, 0));
    for (int i = 0; i < N; ++i) {
        int toy;
        cin >> toy;
        --toy;
        ++cnt0[toy][i];
    }
    vector<vector<int>> cnt1(M, vector<int>(N + 1, 0));
    for (int j = 0; j < M; ++j) {
        for (int i = 0; i < N; ++i)
            cnt1[j][i + 1] = cnt1[j][i] + cnt0[j][i];
    }
    vector<int> cnt2(1 << M, 0);
    dfs(N, M, cnt1, cnt2, 0, 0, 0);
    vector<int> dp(1 << M, N + 1);
    dp[0] = 0;
    for (int i = 0; i < (1 << M); ++i) {
        bitset<20> bi(i);
        int dp_i = dp[i];
        int c2i = cnt2[i];
        for (int j = 0; j < M; ++j) {
            if (bi.test(j))
                continue;
            int k = i | (1 << j);
            int c2k = cnt2[k];
            int dp_k = dp_i + c2k - c2i - (cnt1[j][c2k] - cnt1[j][c2i]);
            if (dp[k] > dp_k)
                dp[k] = dp_k;
        }
    }
    int all((1 << M) - 1);
    cout << dp[all] << endl;
}

Submission Info

Submission Time
Task D - ぬいぐるみの整理 (Plush Toys)
User atug
Language C++ (GCC 9.2.1)
Score 100
Code Size 1376 Byte
Status AC
Exec Time 159 ms
Memory 27492 KiB

Judge Result

Set Name set01 set02 set03 set04 set05
Score / Max Score 20 / 20 20 / 20 20 / 20 20 / 20 20 / 20
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
set01 data1
set02 data2
set03 data3
set04 data4
set05 data5
Case Name Status Exec Time Memory
data1 AC 5 ms 3472 KiB
data2 AC 3 ms 3724 KiB
data3 AC 28 ms 11424 KiB
data4 AC 71 ms 7820 KiB
data5 AC 159 ms 27492 KiB