제출 #624844

#제출 시각아이디문제언어결과실행 시간메모리
624844dutinmeowStreet Lamps (APIO19_street_lamps)C++17
40 / 100
5072 ms231000 KiB
#define NDEBUG

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

#pragma region debug
#ifndef NDEBUG
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
    return os << '(' << p.first << ", " << p.second << ')';
}

template<typename T1, typename T2, typename T3>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3> &p) {
    return os << '(' << get<0>(p) << ", " << get<1>(p) << ", " << get<2>(p) << ')';
}

template<typename T1, typename T2, typename T3, typename T4>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3, T4> &p) {
    return os << '(' << get<0>(p) << ", " << get<1>(p) << ", " << get<2>(p) << ", " << get<3>(p) << ')';
}

template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
    os << '[';

    if (v.size()) {
        os << *v.begin();

        for (auto i = ++v.begin(); i != v.end(); i++)
            os << ", " << (*i);
    }

    return os << ']';
}

template<typename T>
ostream &operator<<(ostream &os, const deque<T> &d) {
    os << '[';

    if (d.size()) {
        os << *d.begin();

        for (auto i = ++d.begin(); i != d.end(); i++)
            os << ", " << (*i);
    }

    return os << ']';
}

template<typename T>
ostream &operator<<(ostream &os, stack<T> s) {
    os << '[';

    if (s.size()) {
        int n = s.size();
        vector<T> v(n);

        for (int i = 0; i < n; i++) {
            v[i] = s.top();
            s.pop();
        }

        os << v[n - 1];

        for (int i = n - 2; i >= 0; i--) {
            os << ", " << v[i];

        }
    }

    return os << "]>";
}

template<typename T>
ostream &operator<<(ostream &os, queue<T> q) {
    os << '[';

    if (q.size()) {
        int n = q.size();
        vector<T> v(n);

        for (int i = 0; i < n; i++) {
            v[i] = q.front();
            q.pop();
        }

        os << v[n - 1];

        for (int i = n - 2; i >= 0; i--) {
            os << ", " << v[i];
        }
    }

    return os << "]>";
}

template<typename T, size_t N>
ostream &operator<<(ostream &os, const array<T, N> &a) {
    os << '[';

    if (N) {
        os << *a.begin();

        for (auto i = ++a.begin(); i != a.end(); i++)
            os << ", " << (*i);
    }

    return os << ']';
}

template<typename T>
ostream &operator<<(ostream &os, const set<T> &s) {
    os << '[';

    if (s.size()) {
        os << *s.begin();

        for (auto i = ++s.begin(); i != s.end(); i++)
            os << ", " << (*i);
    }

    return os << ']';
}

template<typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &s) {
    os << '[';

    if (s.size()) {
        os << *s.begin();

        for (auto i = ++s.begin(); i != s.end(); i++)
            os << ", " << (*i);
    }

    return os << ']';
}

template<typename T>
ostream &operator<<(ostream &os, const multiset<T> &s) {
    os << '[';

    if (s.size()) {
        os << *s.begin();

        for (auto i = ++s.begin(); i != s.end(); i++)
            os << ", " << (*i);
    }

    return os << ']';
}

template<typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &m) {
    os << '[';

    if (m.size()) {
        os << '(' << m.begin()->first << " : " << m.begin()->second << ')';

        for (auto i = ++m.begin(); i != m.end(); i++)
            os << ", " << '(' << i->first << " : " << i->second << ')';
    }

    return os << ']';
}

template<typename T1, typename T2>
ostream &operator<<(ostream &os, const unordered_map<T1, T2> &m) {
    os << '[';

    if (m.size()) {
        os << '(' << m.begin()->first << " : " << m.begin()->second << ')';

        for (auto i = ++m.begin(); i != m.end(); i++)
            os << ", " << '(' << i->first << " : " << i->second << ')';
    }

    return os << ']';
}

#define dbg1(a)                                             \
          if ((#a)[0] == '\"') {                                  \
              if ((#a) == "\"_h1\"")                              \
                  cerr << "--------------------------------\n";   \
              else if ((#a) == "\"_h2\"")                         \
                  cerr << "================================\n";   \
              else if ((#a) == "\"_h3\"")                         \
                  cerr << "≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n";   \
              else if ((#a) == "\"_h4\"")                         \
                  cerr << "################################\n";   \
              else                                                \
                  cerr << a;                                      \
          } else {                                                \
              cerr << #a << " = " << a << '\n';                   \
          }
#define dbg2(a, b) dbg1(a) dbg1(b)
#define dbg3(a, b, c) dbg1(a) dbg2(b, c)
#define dbg4(a, b, c, d) dbg1(a) dbg3(b, c, d)
#define dbg5(a, b, c, d, e) dbg1(a) dbg4(b, c, d, e)
#define dbg6(a, b, c, d, e, f) dbg1(a) dbg5(b, c, d, e, f)
#define dbg7(a, b, c, d, e, f, g) dbg1(a) dbg6(b, c, d, e, f, g)
#define dbg8(a, b, c, d, e, f, g, h) dbg1(a) dbg7(b, c, d, e, f, g, h)
#define get_dbg(_1, _2, _3, _4, _5, _6, _7, _8, NAME, ...) NAME
#define dbg(...) get_dbg(__VA_ARGS__, dbg8, dbg7, dbg6, dbg5, dbg4, dbg3, dbg2, dbg1)(__VA_ARGS__)
#else
#define dbg(...)
#endif
#pragma endregion debug

template<class Base>
class Segtree : public Base {
    using T = typename Base::T;
    using Base::dval;
    using Base::merge;
    using Base::apply;

protected:
    size_t n;

    struct node {
        T v;
        int l, r;
        node() = default;
        node(T _v, int _l, int _r) : v(_v), l(_l), r(_r) {}
    };

    int root;
    vector<node> tree;

    size_t new_node() {
        tree.emplace_back(dval, -1, -1);
        return tree.size() - 1;
    }

private:
    void update(int i, T v, int t, int tl, int tr) {
        if (tl == tr) {
            apply(tree[t].v, v);
            return;
        }

        int tm = (tl + tr) / 2;

        if (i <= tm) {
            if (tree[t].l == -1)
                tree[t].l = new_node();

            update(i, v, tree[t].l, tl, tm);
        } else {
            if (tree[t].r == -1)
                tree[t].r = new_node();

            update(i, v, tree[t].r, tm + 1, tr);
        }

        tree[t].v = merge(tree[t].l == -1 ? dval : tree[tree[t].l].v, tree[t].r == -1 ? dval : tree[tree[t].r].v);
    }

    T query(int l, int r, int t, int tl, int tr) {
        if (r < tl || tr < l)
            return dval;

        if (l <= tl && tr <= r)
            return tree[t].v;

        int tm = (tl + tr) / 2;
        return merge(tree[t].l == -1 ? dval : query(l, r, tree[t].l, tl, tm), tree[t].r == -1 ? dval : query(l, r,
                     tree[t].r, tm + 1, tr));
    }

public:
    Segtree() = default;

    Segtree(size_t _n) {
        init(_n);
    }

    void init(size_t _n) {
        n = _n;
        root = new_node();
    }

    void reserve(size_t _n) {
        tree.reserve(_n);
    }

    void clear() {
        tree.clear();
    }

    void update(int i, T v) {
        update(i, v, root, 0, n - 1);
    }

    T query(int l, int r) {
        return query(l, r, root, 0, n - 1);
    }
};

struct stinfo {
    using T = int;
    const T dval = 0;
    void apply(T &a, T b) {
        a += b;
    }
    T merge(T a, T b) {
        return a + b;
    }
};

class Fentree {
    size_t n;
    vector<Segtree<stinfo>> tree;

public:
    Fentree() = default;

    Fentree(size_t _n) {
        init(_n);
    }

    void init(size_t _n) {
        n = _n;
        tree.resize(n + 1);

        for (int i = 1; i <= n; i++)
            tree[i].init(n);
    }

    void update(int i, int j, int v) {
        // dbg("_h2", "updated:\n", i, j, v);
        for (i++; i <= n; i += i & -i)
            tree[i].update(j, v);
    }

    int query(int i, int l, int r) {
        int ret = 0;

        for (i++; i; i -= i & -i)
            ret += tree[i].query(l, r);

        return ret;
    }

    int query(int i, int j, int l, int r) {
        return query(j, l, r) - query(i - 1, l, r);
    }
};

int main() {
    int N, Q;
    string S;
    cin >> N >> Q >> S;
    set<int> off;
    Fentree bit(N + 1);

    for (int i = 0; i < N; i++) {
        if (S[i] == '0') {
            auto [it, b] = off.insert(i);
            int r = *it - 1;
            int l = (it == off.begin() ? 0 : *prev(it) + 1);
            // update [l, r] x [l, r]
            dbg("_h4", "square update\n", l, r, l, r);
            bit.update(l, l, Q);
            bit.update(r + 1, l, -Q);
            bit.update(l, r + 1, -Q);
            bit.update(r + 1, r + 1, Q);
        } else if (i == N - 1) {
            int r = N - 1;
            int l = (off.empty() ? 0 : *prev(off.end()) + 1);
            // update [l, r] x [l, r]
            dbg("_h4", "square update\n", l, r, l, r);
            bit.update(l, l, Q);
            bit.update(r + 1, l, -Q);
            bit.update(l, r + 1, -Q);
            bit.update(r + 1, r + 1, Q);
        }
    }

    //dbg(off);
    for (int q = 1; q <= Q; q++) {
        string t;
        cin >> t;

        if (t == "query") {
            int l, r;
            cin >> l >> r;
            l--, r -= 2;

            if (off.lower_bound(l) == off.upper_bound(r)) {
                dbg("_h4", "query v1:\n", l, r, bit.query(0, l, 0, r), q);
                cout << bit.query(0, l, 0, r) - (Q - q) << '\n';
            } else {
                dbg("_h4", "query v2:\n", l, r, bit.query(0, l, 0, r), q);
                cout << bit.query(0, l, 0, r) << '\n';
            }
        } else if (t == "toggle") {
            int k;
            cin >> k;
            k--;

            if (S[k] == '0') {
                S[k] = '1';
                off.erase(k);
                auto itl = off.lower_bound(k);
                int l = (itl == off.begin() ? 0 : *prev(itl) + 1);
                auto itr = off.upper_bound(k);
                int r = (itr == off.end() ? N - 1 : *itr - 1);
                // update [l, k] x [k, r]
                dbg("_h4", "square update\n", l, k, k, r, Q - q);
                bit.update(l, k, Q - q);
                bit.update(l, r + 1, q - Q);
                bit.update(k + 1, k, q - Q);
                bit.update(k + 1, r + 1, Q - q);
            } else {
                S[k] = '0';
                auto itl = off.lower_bound(k);
                int l = (itl == off.begin() ? 0 : *prev(itl) + 1);
                auto itr = off.upper_bound(k);
                int r = (itr == off.end() ? N - 1 : *itr - 1);
                off.insert(k);
                // update [l, k] x [k, r]
                bit.update(l, k, q - Q);
                bit.update(l, r + 1, Q - q);
                bit.update(k + 1, k, Q - q);
                bit.update(k + 1, r + 1, q - Q);
            }
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

street_lamps.cpp:6: warning: ignoring '#pragma region debug' [-Wunknown-pragmas]
    6 | #pragma region debug
      | 
street_lamps.cpp:209: warning: ignoring '#pragma endregion debug' [-Wunknown-pragmas]
  209 | #pragma endregion debug
      | 
street_lamps.cpp: In member function 'void Fentree::init(size_t)':
street_lamps.cpp:327:27: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
  327 |         for (int i = 1; i <= n; i++)
      |                         ~~^~~~
street_lamps.cpp: In member function 'void Fentree::update(int, int, int)':
street_lamps.cpp:333:21: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
  333 |         for (i++; i <= n; i += i & -i)
      |                   ~~^~~~
#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...