求助
查看原帖
求助
369207
Watware楼主2021/11/21 11:09
#include <bits/stdc++.h>
using namespace std;

const int M = 1e5 + 100;

struct segtree
{
    long long tree[M << 3], in[M];
    int l[M << 3], r[M << 3];
    bool lazy[M << 3];
#define lc (n << 1)
#define rc (n << 1 | 1)
    void init()
    {
        memset(lazy, 0, sizeof(lazy));
    }
    void pushup(int n)
    {
        tree[n] = tree[lc] + tree[rc];
    }
    void pushdown(int n)
    {
        if (lazy[n])
            tree[n] = r[n] - l[n] + 1 - tree[n];
        lazy[lc] = lazy[n] ^ lazy[lc], lazy[rc] = lazy[n] ^ lazy[rc];
        lazy[n] = false;
    }
    void build(int n, int l, int r)
    {
        this->l[n] = l, this->r[n] = r;
        if (l == r)
        {
            tree[n] = in[l];
            return;
        }
        int mid = l + r >> 1;
        build(lc, l, mid), build(rc, mid + 1, r);
        pushup(n);
    }
    int query(int n, int dl, int dr)
    {
        pushdown(n);
        if (dl == l[n] && dr == r[n])
            return tree[n];
        int mid = l[n] + r[n] >> 1;
        if (dr <= mid)
            return query(lc, dl, dr);
        if (dl > mid)
            return query(rc, dl, dr);
        return query(lc, dl, mid) + query(rc, mid + 1, dr);
    }
    void modify(int n, int dl, int dr)
    {
        pushdown(n);
        if (dl == l[n] && dr == r[n])
        {
            lazy[n] ^= 1;
            return;
        }
        tree[n] = tree[n] + dr - dl + 1 - 2 * query(1, dl, dr);
        int mid = l[n] + r[n] >> 1;
        if (dr <= mid)
            modify(lc, dl, dr);
        else if (dl > mid)
            modify(rc, dl, dr);
        else
            modify(lc, dl, mid), modify(rc, mid + 1, dr);
    }
} tree[12];
int n, init, d[12];

int main()
{
    for (int i = 0; i < 12; i++)
        tree[i].init();
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &init);
        for (int j = 0; j < 12; j++)
        {
            tree[j].in[i] = init & 1;
            init >>= 1;
        }
    }
    d[0] = 1;
    for (int i = 1; i < 12; i++)
        d[i] = d[i - 1] << 1;
    for (int i = 0; i < 12; i++)
        tree[i].build(1, 1, n);
    scanf("%d", &n);
    while (n--)
    {
        int opt, x, y, z;
        scanf("%d", &opt);
        if (opt == 1)
        {
            scanf("%d%d", &x, &y);
            long long ans = 0;
            for (int i = 0; i < 12; i++)
            {
                ans += 1ll * tree[i].query(1, x, y) * d[i];
            }
            printf("%lld\n", ans);
        }
        else
        {
            scanf("%d%d%d", &x, &y, &z);
            for (int i = 0; i < 12; i++)
                if ((z >> i) & 1)
                    tree[i].modify(1, x, y);
        }
    }
    return 0;
}

从第11个点开始WA

2021/11/21 11:09
加载中...