过不了样例但是 AC 求助
查看原帖
过不了样例但是 AC 求助
329316
kernel_panic楼主2022/10/9 22:42

RT

样例输出第三行为560,我的输出为564,提交后仍能够通过本题。

这是评测记录

这是我的代码:

#include <algorithm>
#include <cstdint>
#include <iostream>

using u32 = uint32_t;
constexpr int MXL = 32;
constexpr size_t N = 1 << 20;

int n, m;
u32 a[N], b[N];

struct lb {
    u32 a[MXL];
    lb &ins(u32 x) {
        if (!x) return *this;
        for (int i = MXL - 1; i >= 0; i--) {
            if (x & (1u << i)) {
                if (!a[i]) return a[i] = x, *this;
                else x ^= a[i];
            }
        }
        return *this;
    }
    u32 calc(u32 v) {
        for (int i = MXL - 1; i >= 0; i--) { v = std::max(v, v ^ a[i]); }
        return v;
    }
    lb &operator+=(const lb &a) {
        for (int i = MXL - 1; i >= 0; i--) { (*this).ins(a.a[i]); }
        return *this;
    }
    friend lb operator+(const lb &a, const lb &b) { return lb(a) += b; }
};

#define lch (p * 2)
#define rch (p * 2 + 1)
#define mid ((cl + cr) / 2)
struct node {
    lb a;
    u32 v;
} t[N << 2];
void sync_value(int p) { t[p].a = t[lch].a + t[rch].a, t[p].v = t[lch].v ^ t[rch].v; }
void build(int p = 1, int cl = 1, int cr = n) {
    if (cl == cr) return t[p].a.ins(b[cl]), t[p].v = b[cl], void();
    build(lch, cl, mid), build(rch, mid + 1, cr);
    sync_value(p);
}
void _upd(int x, u32 d, int p = 1, int cl = 1, int cr = n) {
    if (cl == cr) return b[cl] ^= d, t[p].a = lb{}, t[p].a.ins(b[cl]), t[p].v = b[cl], void();
    (x <= mid) ? _upd(x, d, lch, cl, mid) : _upd(x, d, rch, mid + 1, cr);
    sync_value(p);
}
lb _quea(int l, int r, int p = 1, int cl = 1, int cr = n) {
    if (cl == l && cr == r) return t[p].a;
    if (r <= mid) return _quea(l, r, lch, cl, mid);
    else if (l > mid) return _quea(l, r, rch, mid + 1, cr);
    else return _quea(l, mid, lch, cl, mid) + _quea(mid + 1, r, rch, mid + 1, cr);
}
u32 _quev(int l, int r, int p = 1, int cl = 1, int cr = n) {
    if (cl == l && cr == r) return t[p].v;
    if (r <= mid) return _quev(l, r, lch, cl, mid);
    else if (l > mid) return _quev(l, r, rch, mid + 1, cr);
    else return _quev(l, mid, lch, cl, mid) ^ _quev(mid + 1, r, rch, mid + 1, cr);
}
void upd(int l, int r, u32 d) { _upd(l, d), _upd(r + 1, d); }
u32 que(int l, int r, u32 v) {
    u32 k = _quev(1, l);
    return (l == r) ? std::max(v, v ^ k) : _quea(l + 1, r).ins(k).calc(v);
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin >> n >> m;
    for (int i = 1; i <= n; i++) std::cin >> a[i];
    for (int i = 1; i <= n; i++) b[i] = a[i] ^ a[i - 1];
    build();
    for (int i = 1; i <= m; i++) {
        int opt, l, r;
        u32 v;
        std::cin >> opt >> l >> r >> v;
        if (opt == 1) upd(l, r, v);
        else std::cout << que(l, r, v) << "\n";
    }
    return 0;
}
2022/10/9 22:42
加载中...