Submission #829961

#TimeUsernameProblemLanguageResultExecution timeMemory
829961somethingnewData Transfer (IOI19_transfer)C++17
100 / 100
317 ms2496 KiB
#include <iostream>

#include "algorithm"
#include "array"
#include "bitset"
#include "climits"
#include "cmath"
#include "deque"
#include "iomanip"
#include "map"
#include "numeric"
#include "set"
#include "transfer.h"
#include "vector"
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
using namespace std;
vector<int> rearange(vector<int> a, int k) {
    int n = sz(a) - k;
    vector<int> b(sz(a));
    for (int i = 0; i < k; i++) {
        b[1 << i] = 1;
    }
    int ind = 0;
    for (int i = 0; i < sz(a) - k; i++) {
        while (b[ind] == 1) {
            ind++;
        }
        if (ind < sz(b)) {
            b[ind] = a[i];
            ind++;
        } else {
            cout << "FAC" << ind << endl;
        }
    }
    for (int i = 0; i < k; i++) {
        b[1 << i] = a[n + i];
    }
    return b;
}
vector<int> rearange2(vector<int> a, int k) {
    int n = sz(a) - k;
    vector<int> b(sz(a)), c = b;
    for (int i = 0; i < k; i++) {
        b[1 << i] = 1;
    }
    int ind = 0;
    for (int i = 0; i < sz(a) - k; i++) {
        while (ind < sz(b) and b[ind] == 1) {
            ind++;
        }
        if (ind < sz(c))
            c[i] = a[ind];
        else {
            cout << "BLYA" << ind << endl;
        }
        ind++;
    }
    for (int i = 0; i < k; i++) {
        c[n + i] = a[1 << i];
    }
    return c;
}
void addzer(vector<int> &a) {
    vector<int> b = {0};
    for (auto i : a) {
        b.push_back(i);
    }
    swap(a, b);
}
vector<int> get_attachment(vector<int> source) {
    addzer(source);
    int n = sz(source);
    int k = 7;
    if (n > 90)
        k = 9;
    vector<int> beba(k);
    for (int i = 0; i < k; i++) {
        source.push_back(0);
    }
    // for (auto i : source)
    //     cout << i;
    // cout << '\n';
    source = rearange(source, k);
    // source = rearange2(source, k);
    // for (auto i : source)
    //    cout << i;
    // cout << '\n';
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < n + k; j++) {
            if (j & (1 << i))
                beba[i] ^= source[j];
        }
    }
    return beba;
}
vector<int> retrieve(vector<int> data) {
    addzer(data);
    int n = sz(data);
    int k = 7;
    if (n > 90)
        k = 9;
    n -= k;
    for (int i = n; i < n + k; i++) {
        // data[i] = 2 + i - n;
    }

    // for (auto i : data)
    //     cout << i;
    //  cout << '\n';
    data = rearange(data, k);
    // for (auto i : data)
    //     cout << i;
    //  cout << '\n';
    //   cout << n << ' ' << k << '\n';
    vector<int> beba(k);
    int ind = 0;
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < n + k; j++) {
            if (j & (1 << i))
                beba[i] ^= data[j];
        }
        if (beba[i] != 0)
            ind += (1 << i);
    }
    // cerr << ind << endl;
    //  exit(0);
    data[ind] ^= 1;

    data = rearange2(data, k);
    vector<int> res;
    for (int i = 1; i < n; i++) {
        res.push_back(data[i]);
        // cout << data[i];
    }
    // cout << endl;
    return res;
}

#ifdef LOCAL

static inline string run_scenario() {
    int c;
    cin >> c;
    if (c < -1)
        return "invalid corruption index";
    string source_str;
    cin >> source_str;
    const int N = source_str.size();
    const int max_attachment_size = 2 * N;
    vector<int> source;
    for (int i = 0; i < N; i++)
        source.push_back(source_str[i] - '0');

    vector<int> attachment = get_attachment(source);
    if (int(attachment.size()) > max_attachment_size)
        return "attachment too large";
    for (int x : attachment)
        if (x != 0 && x != 1)
            return "invalid attachment integer value";

    vector<int> data(source);
    data.insert(data.end(), attachment.begin(), attachment.end());

    if (c >= int(data.size()))
        return "invalid corruption index";

    if (c >= 0)
        data[c] = 1 - data[c];

    vector<int> result_source = retrieve(data);

    if (source != result_source)
        return "wrong source retrieval";

    return string("OK K=") + to_string(attachment.size());
}

int main() {
    freopen("inp.txt", "r", stdin);
    int T;
    cin >> T;
    for (int scenario = 0; scenario < T; scenario++) {
        string result = run_scenario();
        cout << "scenario #" << scenario << ": " << result << endl;
    }
    return 0;
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...