求助!调了几个小时了样例还没过
查看原帖
求助!调了几个小时了样例还没过
704234
Sad_Rex楼主2023/3/4 17:13
#include <bits/stdc++.h>
using namespace std;

int n, m, op, l , r, f[800005], a[200005];
char ch;

void maketree( int k , int l , int r )
{
    if( l == r )
    {
        f[k] = a[l];
        return;
    }
    int m = (l + r) / 2;
    maketree( k * 2 , l , m );
    maketree( k * 2 + 1 , m + 1 , r );
    f[k] = f[2 * k] + f[2 * k + 1];
}

void add( int k, int bl, int br , int l , int r )
{
    if( bl == l && br == r )
    {
        f[k] = (r - l + 1) - f[k];
        return;
    }
    if( l == r )
    {
        f[k] = !f[k];
        return;
    }
    int m = (bl + br) / 2;
    if( r <= m ) add( k * 2 , bl , m , l , r );
    else
        if( l > m )
            add( k * 2 + 1 , m + 1 , br , l , r );
        else add( k * 2 , bl , m , l , m ) , add( k * 2 + 1 , m + 1 , br , m + 1 , r );
} 
int fun( int k, int bl, int br , int l , int r )
{
    if( bl == l && br == r  )
    {
        return f[k];
    }
    int m = (bl + br) / 2;
    if( r <= m ) return fun( k * 2 , bl , m , l , r );
    else
        if( l > m )
            return fun( k * 2 + 1 , m + 1 , br , l , r );
        else return fun( k * 2 , bl , m , l , m ) + fun( k * 2 + 1 , m + 1 , br , m + 1 , r );
}

int main()
{
    cin >> n >> m;
    for( int i = 1 ; i <= n ; i ++ )
    {
        cin >> ch;
        a[i] = ch - '0';
    }
    maketree( 1 , 1 , n );
    for( int i = 1 ; i <= m ; i ++ )
    {
        cin >> op >> l >> r;
        if( op == 0 )
        {
            add( 1 , 1 , n , l , r );
        }
        else
        {
            cout << fun( 1 , 1 , n , l , r ) << endl;
        }
    }
    
    return 0;
}
2023/3/4 17:13
加载中...