求助!调了几个小时了样例还没过
查看原帖
求助!调了几个小时了样例还没过
677234
FstAutoMaton楼主2023/2/2 15:18

RT,代码如下:

#include <bits/stdc++.h>
using namespace std;
const int kMaxn = 2e5 + 5;
int n, m, a[kMaxn];
struct Segment_tree {
  int t[kMaxn * 4], tag[kMaxn * 4];
  Segment_tree() {
    memset( t, 0, sizeof( t ) );
    memset( tag, 0, sizeof( tag ) );
  }
  void push_up( int u ) {
    t[u] = t[u * 2] + t[u * 2 + 1];
  }
  void biuld( const int a[], int u, int l, int r ) {
    if( l == r ) {
      t[u] = a[l];
      return ;
    }
    int mid = ( l + r ) >> 1;
    biuld( a, u * 2, l, mid );
    biuld( a, u * 2 + 1, mid + 1, r );
    push_up( u );
  }
  void addtag( int u, int l, int r ) {
    t[u] = r - l + 1 - t[u];
    tag[u] ^= 1;
  }
  void push_down( int u, int l, int r ) {
    int mid = ( l + r ) >> 1;
    addtag( u * 2, l, mid );
    addtag( u * 2 + 1, mid + 1, r );
    tag[u] = 0;
  }
  void update( int u, int l, int r, int L, int R ) {
    if( l > R || r < L ) {
        return ;
    }
    if( L <= l && r <= R ) {
      addtag( u, l, r );
      return ;
    }
    push_down( u, l, r );
    int mid = ( l + r ) >> 1;
    update( u * 2, l, mid, L, R );
    update( u * 2 + 1, mid + 1, r, L, R );
    push_up( u );
  }
  int query( int u, int l, int r, int L, int R ) {
    if( tag[u] ) {
      push_down( u, l, r );
    }
    if( L <= l && r <= R ) {
        return t[u];
    }
    if( l > R || r < L ) {
        return 0;
    }
    int mid = ( l + r ) >> 1;
    // push_down( u, l, r );
    return query( u * 2, l, mid, L, R ) + query( u * 2 + 1, mid + 1, r, L, R );
  }
}T;
int main() {
  cin >> n >> m;
  for( int i = 1; i <= n; i ++ ) {
    char c;
    cin >> c;
    a[i] = c - '0';
  }
  T.biuld( a, 1, 1, n );
  for( int i = 1; i <= m; i ++ ) {
    int x, y, op;
    cin >> op;
    if( op ) {
        cin >> x >> y;
        cout << T.query( 1, 1, n, x, y ) << endl;
    }
    else {
        cin >> x >> y;
        T.update( 1, 1, n, x, y );
    }
  }
}
2023/2/2 15:18
加载中...