线段树求大佬们看看呀
查看原帖
线段树求大佬们看看呀
105820
阿尔托莉雅丶楼主2021/3/7 20:17
#include <iostream>
using namespace std;
const int N = 2e5 + 5;

int n, m;
char s[N];
int t[N << 2];
bool lazy[N << 2];

inline void pushup(int k)
{
    t[k] = t[k << 1] + t[k << 1 | 1];
}

inline void pushdown(int k, int ln, int rn)
{
    t[k << 1] = ln - t[k << 1];
    t[k << 1 | 1] = rn - t[k << 1 | 1];
    
    lazy[k << 1] = ~lazy[k << 1];
    lazy[k << 1 | 1] = ~lazy[k << 1 | 1];

    lazy[k] = 0;
}

void maketree(int k, int l, int r)
{
    if(l == r)
    {
        t[k] = s[l] - '0';
        return;
    }

    int mid = l + (r - l >> 1);

    maketree(k << 1, l, mid);
    maketree(k << 1 | 1, mid + 1, r);

    pushup(k);
}

void update(int k, int x, int y, int l, int r)
{
    if(x <= l && y >= r)
    {
        lazy[k] = ~lazy[k];
        t[k] = r - l + 1 - t[k];
        return;
    }
    int mid = l + (r - l >> 1);
    if(lazy[k])
        pushdown(k, mid - l + 1, r - mid);

    if(x <= mid)
        update(k << 1, x, y, l, mid);
    if(y > mid)
        update(k << 1 | 1, x, y, mid + 1, r);

    pushup(k);
}

int query(int k, int x, int y, int l, int r)
{
    if(x <= l && y >= r)
        return t[k];

    int mid = l + (r - l >> 1);
    int lson = k << 1;
    int rson = lson | 1, ans = 0;

    pushdown(k, mid - l + 1, r - mid);

    if(x <= mid)
        ans += query(lson, x, y, l, mid);
    if(y > mid)
        ans += query(rson, x, y, mid + 1, r);
        
    return ans;
}

int main(void)
{
    int op, x, y;
    cin >> n >> m;

    cin >> s + 1;

    maketree(1, 1, n);

    while(m--)
    {
        cin >> op >> x >> y;

        if(op == 0)
            update(1, x, y, 1, n);
        else
        {
            cout << query(1, x, y, 1, n) << '\n';
        }
    }

    return 0;
}
2021/3/7 20:17
加载中...