結果

問題 No.1963 Subset Mex
ユーザー qwewe
提出日時 2025-05-14 13:25:31
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 6,514 bytes
コンパイル時間 1,465 ms
コンパイル使用メモリ 108,572 KB
実行使用メモリ 21,796 KB
最終ジャッジ日時 2025-05-14 13:26:49
合計ジャッジ時間 9,284 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 2 TLE * 1 -- * 23
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <algorithm>
#include <queue>

// Global limit for values, determined after reading N and initial S_i
int V_LIMIT_EFFECTIVE;

// Function to calculate MEX of a multiset represented by a frequency map
int calculate_mex(const std::map<int, int>& selection_counts) {
    // "selection_counts" represents the chosen subset C, which must be non-empty.
    // Problem statement guarantees C is non-empty.
    int mex = 0;
    while (true) {
        if (selection_counts.count(mex)) {
            mex++;
        } else {
            break;
        }
    }
    return mex;
}

// Converts frequency map to counts vector
std::vector<int> to_counts_vector(const std::map<int, int>& s_map) {
    std::vector<int> counts(V_LIMIT_EFFECTIVE + 1, 0);
    for (auto const& [val, count] : s_map) {
        if (val >= 0 && val <= V_LIMIT_EFFECTIVE) { // Defensive check for val range
            counts[val] = count;
        }
        // Values outside this range should not occur based on problem logic
    }
    return counts;
}

// Converts counts vector to frequency map
std::map<int, int> to_map(const std::vector<int>& counts_vec) {
    std::map<int, int> s_map;
    for (int i = 0; i <= V_LIMIT_EFFECTIVE; ++i) {
        if (counts_vec[i] > 0) {
            s_map[i] = counts_vec[i];
        }
    }
    return s_map;
}

// Stores distinct elements and their counts from current S for easier iteration in DFS
struct DistinctElementInfo {
    int value;
    int count_in_s; // Count of this value in the current multiset S
};
std::vector<DistinctElementInfo> distinct_elements_in_current_s;

// For BFS
std::set<std::vector<int>> visited_states_global;
std::queue<std::vector<int>> q_global;

// DFS function to generate subsets C
// k_distinct_idx: current index in distinct_elements_in_current_s
// current_selection_map: counts for subset C being built
// s_minus_selection_map: counts for S - C being built
void generate_subsets_dfs(
    int k_distinct_idx,
    std::map<int, int>& current_selection_map,
    std::map<int, int>& s_minus_selection_map) {

    if (k_distinct_idx == distinct_elements_in_current_s.size()) {
        // Base case: a subset C (current_selection_map) and S-C (s_minus_selection_map) are formed
        if (current_selection_map.empty()) { // Must select at least one element for C
            return;
        }

        int mex_val = calculate_mex(current_selection_map);

        std::map<int, int> next_s_map = s_minus_selection_map;
        if (mex_val >=0 && mex_val <= V_LIMIT_EFFECTIVE) { // Add mex_val if it's within tracked range
             next_s_map[mex_val]++;
        }
        // If mex_val > V_LIMIT_EFFECTIVE, it implies logic error or V_LIMIT_EFFECTIVE too small
        // Based on analysis, mex_val should be <= N_initial <= V_LIMIT_EFFECTIVE.

        std::vector<int> next_s_counts_vec = to_counts_vector(next_s_map);

        if (visited_states_global.find(next_s_counts_vec) == visited_states_global.end()) {
            visited_states_global.insert(next_s_counts_vec);
            q_global.push(next_s_counts_vec);
        }
        return;
    }

    const auto& elem_info = distinct_elements_in_current_s[k_distinct_idx];
    int val = elem_info.value;
    int count_in_s = elem_info.count_in_s;

    // Iterate on how many instances of 'val' are put into C
    for (int count_for_selection = 0; count_for_selection <= count_in_s; ++count_for_selection) {
        int count_for_s_minus_selection = count_in_s - count_for_selection;

        if (count_for_selection > 0) {
            current_selection_map[val] = count_for_selection;
        }
        if (count_for_s_minus_selection > 0) {
            s_minus_selection_map[val] = count_for_s_minus_selection;
        }

        generate_subsets_dfs(k_distinct_idx + 1, current_selection_map, s_minus_selection_map);

        // Backtrack: remove val from current_selection_map and s_minus_selection_map
        if (count_for_selection > 0) {
            current_selection_map.erase(val);
        }
        if (count_for_s_minus_selection > 0) {
            s_minus_selection_map.erase(val);
        }
    }
}


int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int N_initial;
    std::cin >> N_initial;

    std::map<int, int> initial_s_map;
    int max_s_i_initial = 0;
    for (int i = 0; i < N_initial; ++i) {
        int s_val;
        std::cin >> s_val;
        initial_s_map[s_val]++;
        if (s_val > max_s_i_initial) {
            max_s_i_initial = s_val;
        }
    }
    
    V_LIMIT_EFFECTIVE = std::max(N_initial, max_s_i_initial);
    // Ensure V_LIMIT_EFFECTIVE handles small N or S_i, e.g. N=1, S={0} -> V_LIMIT_EFFECTIVE=1.
    // mex({0}) is 1. Max value could be 1. Counts vector size V_LIMIT_EFFECTIVE+1 is fine.

    std::vector<int> initial_counts_vec = to_counts_vector(initial_s_map);

    q_global.push(initial_counts_vec);
    visited_states_global.insert(initial_counts_vec);

    while (!q_global.empty()) {
        std::vector<int> current_s_counts_vec = q_global.front();
        q_global.pop();

        std::map<int, int> current_s_map = to_map(current_s_counts_vec);

        distinct_elements_in_current_s.clear();
        for (auto const& [val, count] : current_s_map) {
            distinct_elements_in_current_s.push_back({val, count});
        }
        
        // If S is empty (no distinct elements), skip. (S cannot be empty by problem logic)
        if (current_s_map.empty() && !distinct_elements_in_current_s.empty()){
             // This means distinct_elements_in_current_s was not cleared or current_s_map logic error.
             // This should not happen.
        }
        if (distinct_elements_in_current_s.empty() && !current_s_map.empty()){
             // This implies current_s_map has elements but distinct_elements_in_current_s is empty.
             // This should not happen.
        }
        // The only case to check is if current_s_map is truly empty.
        // But as size is at least 1, this state means something like {0:0} which is not possible.

        std::map<int, int> temp_selection_map;
        std::map<int, int> temp_s_minus_selection_map;
        generate_subsets_dfs(0, temp_selection_map, temp_s_minus_selection_map);
    }

    std::cout << visited_states_global.size() % 998244353 << std::endl;
    // The problem asks for count modulo 998244353. Size of set itself is the count.

    return 0;
}
0