imsuck's library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub imsuck/library

:heavy_check_mark: test/yosupo/ds/queue_operate_all_composite.test.cpp

Depends on

Code

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

#include <bits/stdc++.h>
using namespace std;

#include "ds/swag.hpp"
#include "math/modint.hpp"

using mint = modint998;

struct M {
    struct T {
        mint a = 1, b = 0;
        mint operator()(mint x) { return a * x + b; }
    };
    static T id() { return {}; }
    static T op(T l, T r) { return {r.a * l.a, r.a * l.b + r.b}; }
};

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int q;
    cin >> q;
    SWAG<M> swag;
    while (q--) {
        int op, a, b, x;
        cin >> op;
        if (op == 0) {
            cin >> a >> b;
            swag.push({a, b});
        } else if (op == 1) {
            swag.pop();
        } else {
            cin >> x;
            cout << swag.query()(x) << "\n";
        }
    }
}
#line 1 "test/yosupo/ds/queue_operate_all_composite.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/queue_operate_all_composite"

#include <bits/stdc++.h>
using namespace std;

#line 2 "ds/swag.hpp"

template<class M> struct SWAG {
    using T = typename M::T;

    T front() const { return f.size() ? getf() : b.front()[0]; }
    T back() const { return b.size() ? getb() : f.back()[0]; }
    void push(const T &x) { b.push_back({x, M::op(getb<1>(), x)}); }
    void pop() {
        assert(size());
        if (f.empty()) {
            int n = size(), i = 0;
            vector<T> xs(n);
            for (; b.size(); b.pop_back()) xs[i++] = b.back()[0];
            for (i = 0; i < n; i++)
                f.push_back({xs[i], M::op(xs[i], getf<1>())});
        }
        f.pop_back();
    }

    T query() const { return M::op(getf<1>(), getb<1>()); }

    int size() const { return int(f.size() + b.size()); }
    bool empty() const { return size() == 0; }

    vector<array<T, 2>> f, b;
    template<int d = 0> T getf() const {
        return f.size() ? f.back()[d] : M::id();
    }
    template<int d = 0> T getb() const {
        return b.size() ? b.back()[d] : M::id();
    }
};
#line 2 "math/modint.hpp"

// clang-format off
template<uint32_t m> struct modint {
    static_assert(m >= 1, "Modulus must be in the range [1;2^31)");

    using mint = modint;
    static constexpr bool is_simple = true;

    static constexpr uint32_t mod() noexcept { return m; }
    constexpr modint() noexcept = default;
    constexpr modint(int64_t v) noexcept : _v(uint32_t((v %= m) < 0 ? v + m : v)) {}
    constexpr static mint raw(uint32_t v) noexcept { mint x; return x._v = v, x; }
    template<class T> constexpr explicit operator T() const noexcept { return _v; }

    constexpr mint &operator++() noexcept { return _v = ++_v == mod() ? 0 : _v, *this; }
    constexpr mint &operator--() noexcept { --(_v ? _v : _v = mod()); return *this; }
    constexpr mint operator++(int) noexcept { return exchange(*this, ++mint(*this)); }
    constexpr mint operator--(int) noexcept { return exchange(*this, --mint(*this)); }

    constexpr mint &operator+=(mint rhs) noexcept {
        return _v = int(_v += rhs._v - mod()) < 0 ? _v + mod() : _v, *this;
    }
    constexpr mint &operator-=(mint rhs) noexcept {
        return _v = int(_v -= rhs._v) < 0 ? _v + mod() : _v, *this;
    }
    constexpr mint &operator*=(mint rhs) noexcept {
        return _v = uint64_t(_v) * rhs._v % mod(), *this;
    }
    constexpr mint &operator/=(mint rhs) noexcept {
        return *this = *this * rhs.inv();
    }

    constexpr friend mint operator+(mint l, mint r) noexcept { return l += r; }
    constexpr friend mint operator-(mint l, mint r) noexcept { return l -= r; }
    constexpr friend mint operator*(mint l, mint r) noexcept { return l *= r; }
    constexpr friend mint operator/(mint l, mint r) noexcept { return l /= r; }

    constexpr mint operator+() const noexcept { return *this; }
    constexpr mint operator-() const noexcept { return raw(_v ? mod() - _v : 0); }

    constexpr friend bool operator==(mint l, mint r) noexcept { return l._v == r._v; }
    constexpr friend bool operator!=(mint l, mint r) noexcept { return l._v != r._v; }
    constexpr friend bool operator<(mint l, mint r) noexcept { return l._v < r._v; }

    constexpr mint pow(uint64_t n) const noexcept {
        mint b = *this, res = 1;
        while (n) n & 1 ? res *= b : 0, b *= b, n >>= 1;
        return res;
    }

    constexpr mint inv() const noexcept {
        int a = _v, b = mod(), x = 1, y = 0;
        while (b) {
            x = exchange(y, x - a / b * y);
            a = exchange(b, a % b);
        }
        assert(a == 1);
        return x;
    }

    friend istream &operator>>(istream &is, mint &x) {
        int64_t v{};
        return is >> v, x = v, is;
    }
    friend ostream &operator<<(ostream &os, const mint &x) { return os << x._v; }

  private:
    uint32_t _v = 0;
};
using modint107 = modint<1'000'000'007>;
using modint998 = modint<998'244'353>;
// clang-format on
#line 8 "test/yosupo/ds/queue_operate_all_composite.test.cpp"

using mint = modint998;

struct M {
    struct T {
        mint a = 1, b = 0;
        mint operator()(mint x) { return a * x + b; }
    };
    static T id() { return {}; }
    static T op(T l, T r) { return {r.a * l.a, r.a * l.b + r.b}; }
};

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int q;
    cin >> q;
    SWAG<M> swag;
    while (q--) {
        int op, a, b, x;
        cin >> op;
        if (op == 0) {
            cin >> a >> b;
            swag.push({a, b});
        } else if (op == 1) {
            swag.pop();
        } else {
            cin >> x;
            cout << swag.query()(x) << "\n";
        }
    }
}

Test cases

Env Name Status Elapsed Memory
g++ example_00 :heavy_check_mark: AC 5 ms 4 MB
g++ example_01 :heavy_check_mark: AC 4 ms 4 MB
g++ large_max_00 :heavy_check_mark: AC 86 ms 16 MB
g++ large_max_01 :heavy_check_mark: AC 87 ms 16 MB
g++ large_min_00 :heavy_check_mark: AC 70 ms 4 MB
g++ large_min_01 :heavy_check_mark: AC 70 ms 4 MB
g++ large_triangle_00 :heavy_check_mark: AC 69 ms 6 MB
g++ large_triangle_01 :heavy_check_mark: AC 70 ms 6 MB
g++ max_random_00 :heavy_check_mark: AC 91 ms 13 MB
g++ max_random_01 :heavy_check_mark: AC 89 ms 12 MB
g++ max_random_02 :heavy_check_mark: AC 89 ms 12 MB
g++ random_00 :heavy_check_mark: AC 63 ms 7 MB
g++ random_01 :heavy_check_mark: AC 76 ms 8 MB
g++ random_02 :heavy_check_mark: AC 13 ms 4 MB
g++ small_00 :heavy_check_mark: AC 4 ms 4 MB
g++ small_01 :heavy_check_mark: AC 4 ms 4 MB
g++ small_02 :heavy_check_mark: AC 4 ms 4 MB
g++ small_03 :heavy_check_mark: AC 4 ms 4 MB
g++ small_04 :heavy_check_mark: AC 4 ms 4 MB
clang++ example_00 :heavy_check_mark: AC 5 ms 4 MB
clang++ example_01 :heavy_check_mark: AC 4 ms 4 MB
clang++ large_max_00 :heavy_check_mark: AC 83 ms 15 MB
clang++ large_max_01 :heavy_check_mark: AC 84 ms 15 MB
clang++ large_min_00 :heavy_check_mark: AC 68 ms 4 MB
clang++ large_min_01 :heavy_check_mark: AC 68 ms 4 MB
clang++ large_triangle_00 :heavy_check_mark: AC 68 ms 6 MB
clang++ large_triangle_01 :heavy_check_mark: AC 71 ms 6 MB
clang++ max_random_00 :heavy_check_mark: AC 91 ms 13 MB
clang++ max_random_01 :heavy_check_mark: AC 91 ms 13 MB
clang++ max_random_02 :heavy_check_mark: AC 93 ms 13 MB
clang++ random_00 :heavy_check_mark: AC 61 ms 7 MB
clang++ random_01 :heavy_check_mark: AC 74 ms 8 MB
clang++ random_02 :heavy_check_mark: AC 12 ms 4 MB
clang++ small_00 :heavy_check_mark: AC 4 ms 4 MB
clang++ small_01 :heavy_check_mark: AC 4 ms 4 MB
clang++ small_02 :heavy_check_mark: AC 4 ms 4 MB
clang++ small_03 :heavy_check_mark: AC 4 ms 4 MB
clang++ small_04 :heavy_check_mark: AC 4 ms 4 MB
Back to top page