tju3140 Switching Lights

数据加强后很经典

#include  < iostream >
#include 
< ctime >
using   namespace  std;

#define  MAXN 100001

int  n, m;
int  cnt[ 3 * MAXN][ 2 ];

struct  Node{
    
int  l, r, sum;
}nod[
3   *  MAXN];

void  buildtree( int  l,  int  r,  int  u){
    nod[u].l 
=  l;
    nod[u].r 
=  r;
    nod[u].sum 
=   0 ;
    
if  (l  ==  r){
        cnt[u][
0 =   1 ;
        
return ;
    }
    
else {
        buildtree(l, (l 
+  r) / 2 2   *  u);
        buildtree((l 
+  r) / 2   +   1 , r,  2   *  u  +   1 );
        cnt[u][
0 =  cnt[ 2 * u][ 0 +  cnt[ 2 * u + 1 ][ 0 ];
    }
}

void  add( int  l,  int  r,  int  u,  int  s){
    
if  (l  <=  nod[u].l  &&  nod[u].r  <=  r){
        nod[u].sum
++ ;
        
return ;
    }
    s 
+=  nod[u].sum;
    
int  v  =   2   *  u;
    
if  (r  >=  nod[v  +   1 ].l)
        add(l, r, v 
+   1 , s);
    
if  (l  <=  nod[v].r)
        add(l, r, v, s);
    cnt[u][s 
&   1 =  cnt[v][(s  +  nod[v].sum)  &   1 +  cnt[v + 1 ][(s  +  nod[v + 1 ].sum)  &   1 ];
    cnt[u][
1   -  (s  &   1 )]  =  cnt[v][ 1   -  ((s  +  nod[v].sum)  &   1 )]  +  cnt[v + 1 ][ 1   -  ((s  +  nod[v + 1 ].sum)  &   1 )];
}

int   get ( int  l,  int  r,  int  u,  int  s){
    
if  (l  <=  nod[u].l  &&  nod[u].r  <=  r)
        
return  cnt[u][(nod[u].sum  +  s)  &   1 ];
    s 
+=  nod[u].sum;
    
int  ret  =   0 ;
    
if  (l  <=  nod[ 2 * u].r)
        ret 
+=   get (l, r,  2 * u, s);
    
if  (r  >=  nod[ 2 * u + 1 ].l)
        ret 
+=   get (l, r,  2 * u + 1 , s);
    
return  ret;
}




int  main(){
    
int  i, order, l, r;
    
// freopen("C.in", "r", stdin);
    
// freopen("C.out", "w", stdout);
    
// int t = clock();
     while  (scanf( " %d %d " & n,  & m)  !=  EOF){
        memset(cnt, 
0 sizeof (cnt));
        buildtree(
1 , n,  1 );
        
for  (i  =   0 ; i  <  m; i ++ ){
        scanf(
" %d %d %d " & order,  & l,  & r);
            
if  (order  ==   0 )
                add(l, r, 
1 0 );
            
else
                printf(
" %d\n " get (l, r,  1 1 ));
        }
    }
    
// cout << clock() - t << endl;
    
// system("PAUSE");
     return   0 ;
}

你可能感兴趣的:(switch)