/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 532.0 KiB
#2 Wrong Answer 1ms 532.0 KiB
#3 Wrong Answer 1ms 532.0 KiB

Code

#include <bits/stdc++.h>
using namespace std;
using Mask = unsigned long long;

int N, k;
vector<Mask> windows;
Mask fullMask;
bool dfs(int idx, int chosen, Mask used) {
    if (chosen == k) return used == fullMask;
    int rem = k - chosen;
    int remainWindows = windows.size() - idx;
    if (remainWindows < rem) return false;
    for (int i = idx; i < windows.size(); ++i) {
        Mask w = windows[i];
        if ((w & used) == 0) {
            if (dfs(i + 1, chosen + 1, used | w)) return true;
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        cin >> N;
        vector<int> A(N);
        for (int i = 0; i < N; ++i) cin >> A[i];
        sort(A.begin(), A.end());
        int best = 1;
        fullMask = (N == 64 ? ~0ULL : ((1ULL << N) - 1));
        // try block count k from max down
        for (int blocks = N / 2; blocks >= 1; --blocks) {
            if (N % blocks) continue;
            int m = N / blocks;
            if (m < 2) continue;
            // collect possible D values from windows
            set<int> Dvals;
            for (int i = 0; i + m - 1 < N; ++i) {
                Dvals.insert(A[i + m - 1] - A[i]);
            }
            bool found = false;
            for (int D : Dvals) {
                windows.clear();
                // build windows masks
                for (int i = 0; i + m - 1 < N; ++i) {
                    if (A[i + m - 1] - A[i] == D) {
                        Mask mask = 0;
                        for (int j = i; j < i + m; ++j) mask |= (1ULL << j);
                        windows.push_back(mask);
                    }
                }
                if (windows.size() < blocks) continue;
                k = blocks;
                // attempt cover
                if (dfs(0, 0, 0ULL)) {
                    best = blocks;
                    found = true;
                    break;
                }
            }
            if (found) break;
        }
        cout << best << '\n';
    }
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1162 G. Roy and Maximum Partition
Language
C++17 (G++ 13.2.0)
Submit At
2025-08-03 13:45:06
Judged At
2025-08-03 13:45:06
Judged By
Score
0
Total Time
1ms
Peak Memory
532.0 KiB