Submission #986692

#TimeUsernameProblemLanguageResultExecution timeMemory
986692PurpleCrayonAncient Machine 2 (JOI23_ancient2)C++17
97 / 100
71 ms1100 KiB
#include "ancient2.h"
#include <bits/stdc++.h>
using namespace std;

#define sz(v) int(v.size())
#define ar array
typedef long long ll;

mt19937 rng(69);

int rnd(int l, int r) {
	return uniform_int_distribution<int>(l, r)(rng);
}

int qry(vector<int> v) {
    int m = 2 * sz(v);
    vector<int> a(m), b(m);
    for (int i = 0; i < m; i++) {
        int par = i % 2, c = i / 2;
        a[i] = ((c + 1) % sz(v)) * 2 + par;
        if (v[c]) {
            b[i] = ((c + 1) % sz(v)) * 2 + (par ^ 1);
        } else {
            b[i] = a[i];
        }
    }

    return Query(m, a, b) % 2;
}

string Solve(int N) {
    const int p = 57;
    const int n = 1e3;
    assert(n == N);

    bitset<n> b[n]; // basis
    int who[n];
    for (int i = 0; i < n; i++) b[i] = 0;

    int cnt = 0;
    while (cnt < n) {
        int x = rnd(1, p);
        vector<int> use(x);
        for (int i = 0; i < x; i++) use[i] = rnd(0, 1);

        bitset<n> cur;
        int my_who = 0;
        for (int i = 0; i < n; i++) cur[i] = use[i % x];

        for (int i = 0; i < n; i++) if (cur[i]) {
            if (b[i].any()) {
                cur ^= b[i];
                my_who ^= who[i];
            } else {
                b[i] = cur;
                who[i] = my_who ^= qry(use);
                cnt++;
                break;
            }
        }
    }

    string s;
    for (int i = 0; i < n; i++) {
        int ans = 0;

        bitset<n> cur; cur[i] = 1;
        for (int j = 0; j < n; j++) if (cur[j]) {
            cur ^= b[j];
            ans ^= who[j];
        }

        s += char('0' + ans);
    }

    return s;
}
#Verdict Execution timeMemoryGrader output
Fetching results...