QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#295734#6622. Matrix OperationsNOI_AK_MECompile Error//C++239.2kb2023-12-31 20:12:442023-12-31 20:12:44

Judging History

你现在查看的是最新测评结果

  • [2023-12-31 20:12:44]
  • 评测
  • [2023-12-31 20:12:44]
  • 提交

answer

#pragma once

#include <assert.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>

#define F(i, l, r) for (int i = l; i ^ r; ++ i)
#define Fe(i, l, r) for (int i = l; i <= r; ++ i)
#define SC(a, b) static_cast <a> (b)

using std::max;

constexpr unsigned MAXBUF = 33554432, maxm = 5e5, M = maxm + 10, maxv = 1e9, MEM = 1 << 26;

char buf[MAXBUF], buf_t[22], * pout = buf;
const char *pin = buf;

inline unsigned read() {
    for (; *pin < '0'; ++pin);
    unsigned ans = *pin ^ '0';
    for (; * (++pin) >= '0'; ans = ans * 10 + *pin - '0');
    return ans;
}

inline void WriteUE(unsigned long long v) {
    char l = 0;
    for (; v > 9; buf_t[l++] = v % 10, v /= 10);
    for (*pout = SC(char, v) ^ '0'; l; * (++pout) = buf_t[--l] ^ '0');
    *(pout + 1) = '\n', pout += 2;
    return;
}

using i64 = long long;

char pool[MEM], *pool_p = pool;

template <class T> inline void alloc(T *&p, int sz) {
    p = reinterpret_cast<T *>(pool_p), pool_p += sz * sizeof(T), assert(pool_p < pool + MEM);
    F(i, 0, sz) new (p + i) T();
}

template <class T> struct Undo {
    T &x, x0;
    constexpr inline Undo(T &x): x(x), x0(x) {}
    constexpr inline ~Undo() { x = x0; }
};

#define alloc_scope Undo <char*> _(pool_p)

template <class T> struct Inf {};
template <> struct Inf<i64> { static constexpr i64 value = 1LL << 40; };

template<class T>
struct Max {
    T x;
    Max(T x = -Inf<T>::value): x(x) {}
    Max <T> operator + (const Max <T> &w) const { return max(x, w.x); }
    inline void operator += (const Max <T> &w) { x = max(x, w.x); }
};

template<class T>
struct AddOp {
    T x;
    AddOp(T x = T()): x(x) {}
    inline void operator *= (const AddOp <T> &w) { x += w.x; }
    friend inline void operator *= (Max <T> &x, const AddOp <T> &y) { x.x += y.x; }
};

template<class D, class M>
struct MSegTree {
    struct Node {
        D d; M m;
        constexpr inline void app(const M &t) { d *= t, m *= t; }
        constexpr inline void up(const Node &a, const Node &b) { d = a.d + b.d, d *= m; }
    } *tr;
    int mx;
    constexpr inline void alloc(int n) {
        for (mx = 1; mx < n + 2; mx <<= 1);
        ::alloc(tr, mx * 2);
    }
    constexpr inline Node &at(int x) { return tr[mx + x]; }
    D &operator[] (int x) { return tr[mx + x].d; }
    inline void range_update(int l, int r) {
        l += mx, r += mx;
        for (l >>= 1, r >>= 1; l < r; l >>= 1, r >>= 1) for (int x = l; x <= r; ++ x) up(x);
        for (; l; l >>= 1) up(l);
    }
    constexpr inline void up(int x) { tr[x].up(tr[x * 2], tr[x * 2 + 1]); }
    constexpr inline void update(const M &t) { tr[1].app(t); }
    constexpr inline void update_prefix(int x, const M &t) { for (x += mx + 1; x > 1; x >>= 1, up(x)) if (x & 1) tr[x - 1].app(t); }
    constexpr inline D query() { return tr[1].d; }
    constexpr inline void dn(int x) { tr[x * 2].app(tr[x].m), tr[x * 2 + 1].app(tr[x].m), tr[x].m = M(); }
    constexpr inline void dna(int x) {
        x += mx;
        for (unsigned c = __builtin_ctz(mx); c; --c) dn(x >> c);
    }
    constexpr inline void dna(int l, int r) {
        l += mx, r += mx;
        for (unsigned c = __builtin_ctz(mx); c; --c) {
            unsigned L = l >> c, R = r >> c;
            Fe(i, L, R) dn(i);
        }
    }
};

int m;
struct Op {
    int x, y, id, a[2][2];
    constexpr inline void R(int i) {
        x = read(), y = read(), id = i;
        F(i, 0, 2)F(j, 0, 2)a[i][j] = read();
    }
} qs[M], qs2[M];

template<class T>
struct Array {
    T *v;
    int sz;
    Array() {}
    Array(int n) { alloc(n); }
    inline void alloc(int n) { sz = n, ::alloc(v, n); }
    T &operator[](int x) {
        return v[x];
    }
};

template<class T>
struct Grid {
    T *v;
    int xsz, ysz;
    Grid() {}
    Grid(int xn, int yn) {
        alloc(xn, yn);
    }
    void alloc(int xn, int yn) {
        xsz = xn;
        ysz = yn;
        ::alloc(v, xn * yn);
    }
    T &operator()(int x, int y) {
        return v[x * ysz + y];
    }
};

struct Des {
    int sz, x[M], id[M];
    void clr() {
        sz = 0;
    }
    void ins(int a) {
        x[sz++] = a;
    }
    void build() {
        ins(1), ins(m + 1);
        std::sort(x, x + sz);
        sz = std::unique(x, x + sz) - x;
        F(i, 1, sz)F(j, x[i - 1], x[i])id[j] = i;
    }
} xs, ys;

struct NoD {
    char _[0];
    template<class T>
    void operator*=(const T &x) {}
    friend NoD operator+(NoD a, NoD b) {
        return NoD();
    }
};

template<class T>
struct HAddOp {
    T h, a, a1;
    bool commit;
    HAddOp(T x = 0): a1(x), commit(0) {}
    void operator*=(const HAddOp<T> &w) {
        if (w.commit) {
            if (commit) {
                h = max(h, a + a1 + w.h);
                a += a1 + w.a;
                a1 = w.a1;
            } else {
                h = a1 + w.h;
                a = a1 + w.a;
                a1 = w.a1;
                commit = 1;
            }
        } else {
            a1 += w.a1;
        }
    }
};

MSegTree<Max<i64>, AddOp<i64>> tr[M];
MSegTree<NoD, HAddOp<i64>> tr0;

struct DC {
    Array<int> x, y;
    Grid<MSegTree<Max<i64>, AddOp<i64>>::Node> g;
    void set_sz(int sz) {
        x.alloc(sz);
        y.alloc(sz);
    }
    void run(int m1) {
        int sz = x.sz;

        if (sz == 1) {
            F(i, 0, 2)F(j, 0, 2) {
                WriteUE(g(i, j).d.x);
                g(i, j).app(qs[m1].a[i][j]);
            }
            return;
        }

        int o = 0;
        F(I, 0, 2) {
            alloc_scope;
            int sz1 = (I ? sz - sz / 2 : sz / 2);
            DC dc;
            dc.set_sz(sz1);
            Array<int> xe(g.xsz), ye(g.ysz);
            F(i, 0, sz1) {
                xe[x[o + i]] = 1;
                ye[y[o + i]] = 1;
            }
            xe[0] = ye[0] = 0;
            F(i, 1, xe.sz)xe[i] += xe[i - 1];
            F(i, 1, ye.sz)ye[i] += ye[i - 1];
            F(i, 0, sz1) {
                dc.x[i] = xe[x[o + i]];
                dc.y[i] = ye[y[o + i]];
            }
            dc.g.alloc(xe[xe.sz - 1] + 1, ye[ye.sz - 1] + 1);
            F(i, 0, g.xsz)F(j, 0, g.ysz) {
                dc.g(xe[i], ye[j]).d += g(i, j).d;
            }
            dc.run(m1 + o);

            if (!I)
                F(i, 0, g.xsz)F(j, 0, g.ysz) {
                auto v = dc.g(xe[i], ye[j]).m;
                g(i, j).d *= v;
                g(i, j).m = v;
            }

            if (I)
                F(i, 0, g.xsz)F(j, 0, g.ysz) {
                g(i, j).m *= dc.g(xe[i], ye[j]).m;
            }

            o += sz1;
        }
    }
};

i64 v0[M], v1[M];
void cal(int m1, int m2) {
    alloc_scope;

    xs.clr(), ys.clr();
    F(i, m1, m2) {
        Op &q = qs[i];
        xs.ins(q.x);
        ys.ins(q.y);
    }
    xs.build();
    ys.build();

    Grid<i64> g(xs.sz, ys.sz);
    F(i, 1, ys.sz) {
        int L = ys.x[i - 1], R = ys.x[i];
        tr[i].alloc(R - L);
        F(j, L, R)tr[i][j - L + 1] = v0[j];
        tr[i].range_update(1, R - L);
        g(0, i) = tr[i].query().x;
    }
    tr0.alloc(ys.sz);
    F(i, 1, ys.sz)tr0.at(i).m = 0;

    int p = 0;
    F(i, 1, xs.sz) {
        int L = xs.x[i - 1], R = xs.x[i];
        F(x, L, R) {
            for (; p < m && qs2[p].x == x; ++p) {
                Op &q = qs2[p];

                if (q.id >= m1)
                    continue;

                int a1 = q.a[1][0] - q.a[0][0];
                int a2 = q.a[1][1] - q.a[0][1];
                a1 -= a2;
                int w = ys.id[q.y], u = q.y + 1 - ys.x[w - 1];

                i64 a = tr[w].query().x;
                tr[w].update_prefix(u - 1, a1);
                a = tr[w].query().x - a;

                tr0.dna(w);
                auto &w0 = tr0.at(w);
                w0.app(a);

                tr0.update_prefix(w - 1, a1);
                tr0.update(a2);
            }

            HAddOp<i64> m;
            m.h = m.a = m.a1 = 0;
            m.commit = 1;
            tr0.update(m);
        }
        tr0.dna(1, ys.sz);
        F(w, 1, ys.sz) {
            auto &w0 = tr0.at(w).m;
            g(i, w) = g(0, w) + w0.h;
            g(0, w) += w0.a;
            w0 = 0;
        }
    }

    int m0 = m2 - m1;
    DC dc;
    dc.set_sz(m0);
    dc.g.alloc(xs.sz - 1, ys.sz - 1);
    F(i, 1, xs.sz)F(j, 1, ys.sz)dc.g(i - 1, j - 1).d = g(i, j);
    F(i, 0, m0) {
        Op &q = qs[m1 + i];
        dc.x[i] = xs.id[q.x] - 1;
        dc.y[i] = ys.id[q.y] - 1;
    }

    dc.run(m1);

    Fe(i, 1, m)v1[i] = 0;
    F(i, m1, m2) {
        Op &q = qs[i];
        v1[1] += q.a[0][0];
        v1[q.y] += q.a[0][1] - q.a[0][0];
    }
    v0[1] += v1[1];
    Fe(i, 2, m)
        v1[i] += v1[i - 1], v0[i] += v1[i];
}

int main() {
    std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr), std::cin.read(buf, MAXBUF), m = read();
    F(i, 0, m)qs[i].R(i);
    F(i, 0, m)qs2[i] = qs[i];
    std::sort(qs2, qs2 + m, [](const Op & a, const Op & b) {
        return a.x < b.x;
    });
    int B = 2 * __builtin_sqrt(m);

    for (int l = 0, r; l < m; l = r)
        r = std::min(l + B, m), cal(l, r);

    std::cout.write(buf, pout - buf);
}

Details

answer.code:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
answer.code: In member function ‘constexpr void Op::R(int)’:
answer.code:111:17: error: call to non-‘constexpr’ function ‘unsigned int read()’
  111 |         x = read(), y = read(), id = i;
      |             ~~~~^~
answer.code:19:17: note: ‘unsigned int read()’ declared here
   19 | inline unsigned read() {
      |                 ^~~~