Alfred's CP Library

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:heavy_check_mark: verify/verify-yosupo-ds/yosupo-bitset.test.cpp

Depends on

Code

#define PROBLEM "https://judge.yosupo.jp/problem/predecessor_problem"

#include "../../src/alfred/config/io-sync-off.hpp"
#include "../../src/alfred/data_structure/dynamic-bitset.hpp"
#include <iostream>

std::string T;
int n, q, opt, x;

int main(int argc, char const *argv[]) {
    optimizeIO();
    std::cin >> n >> q >> T;

    DynamicBitset bit(n);

    for (int i = 0; i < n; i++) {
        if (T[i] == '1') bit.set(i);
    }

    while (q--) {
        std::cin >> opt >> x;
        if (opt == 0) {
            bit.set(x);
        } else if (opt == 1) {
            bit.set(x, false);
        } else if (opt == 2) {
            std::cout << bit.test(x) << '\n';
        } else if (opt == 3) {
            std::cout << bit.suf(x, true) << '\n';
        } else {
            std::cout << bit.pre(x, true) << '\n';
        }
    }

    return 0;
}
#line 1 "verify/verify-yosupo-ds/yosupo-bitset.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/predecessor_problem"

#line 1 "src/alfred/config/io-sync-off.hpp"
#include <bits/stdc++.h>

inline void optimizeIO(void) {
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL), std::cout.tie(NULL);
}
#line 1 "src/alfred/data_structure/dynamic-bitset.hpp"



#line 7 "src/alfred/data_structure/dynamic-bitset.hpp"

// TODO: Implement resize and bitwise operators. Figure out how to mod.

class DynamicBitset {
private:
    using Word_t = unsigned long long;
    constexpr static int bw = sizeof(Word_t) * 8;
    constexpr static Word_t WORD_MAX = std::numeric_limits<Word_t>::max();
    size_t n, cnt;
    std::vector<Word_t> bits;

    inline int calc_len(void) {
        return (std::max<size_t>(n, bw) + bw - 1) / bw;
    }

public:
    DynamicBitset(size_t N) : n(N), bits(calc_len()) {}
    inline int size(void) { return n; }
    inline int count(void) { return cnt; }
    inline int test(size_t i) { return (bits[i / bw] >> (i % bw)) & 1; }
    inline void set(size_t i, bool val = true) {
        if (test(i) == val) return;
        bits[i / bw] ^= (1ULL << (i % bw));
        val ? cnt++ : cnt--;
    }
    inline void flip(size_t i) {
        bits[i / bw] ^= (1ULL << (i % bw));
        test(i) ? cnt-- : cnt++;
    }
    inline void reset(void) {
        std::fill(bits.begin(), bits.end(), 0);
        cnt = 0;
    }
    inline void clear(void) {
        bits.clear(), cnt = n = 0;
    }
    // find the previous val before i. returns -1 if not found.
    inline int pre(size_t i, bool contain = false, bool val = true) {
        Word_t cur = bits[i / bw];
        for (int j = (int)(i % bw) - (!contain); j >= 0; j--) {
            if ((cur >> j & 1) == val) {
                return i - (i % bw - j);
            }
        }
        for (int j = i / bw - 1; j >= 0; j--) {
            if (bits[j] == (val ? 0 : WORD_MAX)) continue;
            for (int k = bw - 1; k >= 0; k--) {
                if ((bits[j] >> k & 1) == val) {
                    return j * bw + k;
                }
            }
        }
        return -1;
    }
    inline int suf(size_t i, bool contain = false, bool val = true) {
        Word_t cur = bits[i / bw];
        for (int j = i % bw + (!contain); j < bw; j++) {
            if ((cur >> j & 1) == val) {
                return i + (j - i % bw);
            }
        }
        const int len = calc_len();
        for (int j = i / bw + 1; j < len; j++) {
            if (bits[j] == (val ? 0 : WORD_MAX)) continue;
            for (int k = 0; k < bw; k++) {
                if ((bits[j] >> k & 1) == val) {
                    return j * bw + k;
                }
            }
        }
        return -1;
    }
};


#line 6 "verify/verify-yosupo-ds/yosupo-bitset.test.cpp"

std::string T;
int n, q, opt, x;

int main(int argc, char const *argv[]) {
    optimizeIO();
    std::cin >> n >> q >> T;

    DynamicBitset bit(n);

    for (int i = 0; i < n; i++) {
        if (T[i] == '1') bit.set(i);
    }

    while (q--) {
        std::cin >> opt >> x;
        if (opt == 0) {
            bit.set(x);
        } else if (opt == 1) {
            bit.set(x, false);
        } else if (opt == 2) {
            std::cout << bit.test(x) << '\n';
        } else if (opt == 3) {
            std::cout << bit.suf(x, true) << '\n';
        } else {
            std::cout << bit.pre(x, true) << '\n';
        }
    }

    return 0;
}
Back to top page