Submission #1200880

#TimeUsernameProblemLanguageResultExecution timeMemory
1200880NeltMachine (IOI24_machine)C++20
100 / 100
19 ms444 KiB
#include "machine.h"
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;

vector<int> generate_unbalanced_sequence(int n) {
    if (n % 2 != 0) {
        throw invalid_argument("n must be even");
    }
    vector<int> base(n);
    iota(base.begin(), base.end(), 0);

    auto bit_counts = [&](const vector<int>& arr) {
        int maxv = 0;
        for (int x : arr) maxv = max(maxv, x);
        int bits = maxv > 0 ? 32 - __builtin_clz(maxv) : 1;
        vector<int> cnt(bits, 0);
        for (int x : arr) {
            for (int k = 0; k < bits; k++) {
                if (x & (1 << k)) cnt[k]++;
            }
        }
        return cnt;
    };

    auto is_unbalanced = [&](const vector<int>& arr) {
        int half = arr.size() / 2;
        auto cnt = bit_counts(arr);
        for (int c : cnt) {
            if (c == half) return false;
        }
        return true;
    };
    for (int j = n; j <= n + 2; j++) {
        for (int rm = 0; rm < n; rm++) {
            vector<int> A;
            A.reserve(n);
            for (int x : base) if (x != rm) A.push_back(x);
            A.push_back(j);
            if (is_unbalanced(A)) return A;
        }
    }

    throw runtime_error("Failed to generate unbalanced sequence");
}

std::vector<int> find_permutation(int n)
{
    std::vector<int> a(n);
    for (ll i = 0; i < n; i++)
        a[i] = i;
    if (!(n & 1))
        a = generate_unbalanced_sequence(n);
    ll ind[n + 3];
    for (ll i = 0; i < n; i++) ind[a[i]] = i;
    vector<int> b = use_machine(a);
    for (ll bit = 0; bit < 30; bit++)
    {
        ll cnt1 = 0;
        for (ll i = 0; i < n; i++) cnt1 += (a[i] >> bit & 1) - (b[i] >> bit & 1);
        if (cnt1)
            for (ll i = 0; i < n; i++) b[i] ^= (1 << bit);
    }
    for (ll i = 0; i < n; i++) b[i] = ind[b[i]];
    return b;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...