rt,我写的是常规的线段树,下面是我的代码
放到luogu只有#2过了,10pts
//#include<bits/stdc++.h>
//#include<map>
//#include<stack>
//#include<list>
//#include<set>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#define ll long long
#define reg register int
#define gc getchar()
#define MAXN 200010
#define MOD
using namespace std;
inline ll read( void ) ;
int n,m,c,l_,r_;
int tree[MAXN*4];
bool lazy_tag[MAXN*4];
bool In_Range( int l , int r , int L , int R ){
if( l >= L && r <= R ) return 1;
return 0;
}
bool Out_Range( int l , int r , int L , int R ){
if( l > R || r < L ) return 1;
return 0;
}
void make_tag( int x, int l , int r ){
tree[x] = (r-l+1) - tree[x];
lazy_tag[x] = 1 ;
}
void pushdown( int x , int l , int r ){
//如果这个点没有tag的话,就不需要maketag了
if( !lazy_tag[x] ) return ;
int mid = ( l + r ) >> 1 ;
make_tag( x*2 , l , mid );
make_tag( x*2+1 , mid+1 , r );
tree[x] = tree[x*2] + tree[x*2+1];
lazy_tag[x] = 0 ;
}
void set( int x , int l , int r , int L , int R ){
if( Out_Range(l,r,L,R) ) return ;
else if( In_Range(l,r,L,R) ) make_tag(x,l,r);
else {
pushdown(x,l,r);
int mid = ( l + r ) >> 1 ;
set( x*2 , l , mid , L , R );
set( x*2+1 , mid+1 , r , L , R );
tree[x] = tree[x*2] + tree[x*2+1];
}
}
int search( int x , int l , int r , int L , int R ){
if( In_Range(l,r,L,R) ) return tree[x];
else if( Out_Range(l,r,L,R) ) return 0;
else{
if( !Out_Range(l,r,L,R) ){
pushdown(x,l,r);
int mid = (l+r) >> 1 ;
return search( x*2,l,mid,L,R ) + search( x*2+1,mid+1,r,L,R);
}
}
}
int main( void ) {
n = read();
m = read();
for( reg i = 1 ; i <= m ; i++ ){
c = read();
l_ = read();
r_ = read();
if( !c ) set(1,1,n,l_,r_);
else cout << search(1,1,n,l_,r_) << endl ;
}
return 0;
}
inline ll read( void ) {
ll x = 0 , f = 0 ;
char ch = gc ;
while( !isdigit( ch ) )
f |= ( ch == '-' ) , ch = gc ;
while( isdigit( ch ) )
x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ) , ch = gc ;
return f ? -x : x ;
}
我会在评论一楼放一个写好了debug语句的程序awa