蒟蒻线段树RE求助
  • 板块CF240F TorCoder
  • 楼主_luo_gu
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/28 18:43
  • 上次更新2024/3/28 20:48:38
查看原帖
蒟蒻线段树RE求助
950927
_luo_gu楼主2024/3/28 18:43

蒟蒻发现墓前RE在了query部分,不知道为啥,也不知道之后的其他部分是否也会RE。

以下代码:

#include <bits/stdc++.h>
#define int long long
#define lson ( pos << 1 )
#define rson ( pos << 1 | 1 )
using namespace std ;
int n , m , ll , rr , cnt[30] ;
string s ;
struct SegTree {
	int num ;
	int tag ;
};
SegTree tre[28][400005] ;
void pushup ( int i , int pos ){
	tre[i][pos].num = tre[i][lson].num + tre[i][rson].num ;
	return ;
}
void build ( int i , int pos , int l , int r ){
	if ( l == r ){
		tre[i][pos].tag = -1 ;
		return ;
	}
	int mid ;
	mid = ( l + r ) >> 1 ;
	tre[i][pos].tag = -1 ;
	build ( i , lson , l , mid );
	build ( i , rson , mid+1 , r );
	return ;
}
void pushdown( int i , int pos , int l , int r ){
	//如果tag是0则将其覆盖为0,如果tag是1则覆盖为1
	//将初始tag设为-1 
	if( tre[i][pos].tag != -1 ){
		int mid ;
		mid = ( l + r ) >> 1 ;
		tre[i][lson].tag = tre[i][pos].tag ;
		tre[i][rson].tag = tre[i][pos].tag ;
		tre[i][lson].num = ( mid - l + 1 ) * tre[i][pos].tag ;
		tre[i][rson].num = ( r - mid ) * tre[i][pos].tag ;
		tre[i][pos].tag = -1 ;
	}
	return ;
}
void update( int i , int pos , int l , int r , int ql , int qr , int x ){
	if( ql <= l && qr >= r ){
		tre[i][pos].num = ( r - l + 1 )*x ;
		tre[i][pos].tag = x ;
		return ;
	}
	pushdown( i , pos , l , r );
	int mid ;
	mid = ( l + r ) >> 1 ;
	if( ql <= mid ){
		update( i , lson , l , mid , ql , qr , x );
	}
	if( qr > mid ){
		update( i , rson , mid+1 , r , ql , qr , x );
	}
	pushup( i , pos );
	return ;
}
int query( int i , int pos , int l , int r , int ql , int qr ){
	if( ql <= l && qr >= r ){
		return tre[i][pos].num ;
	}
	pushdown( i , pos , l , r );
	int mid ;
	mid = ( l + r ) >> 1 ;
	int res = 0 ;
	if( l <= mid ){
		res += query( i , lson , l , mid , ql , qr );
	}
	if( r > mid ){
		res += query( i , rson , mid+1 , r , ql , qr );
	}
	return res ;
}
signed main(){
	scanf( "%lld%lld" , &n , &m );
	cin >> s ;
	int len ;
	len = s.size() ;
	int p ;
	for( int i = 1 ; i <= 26 ; ++ i ){
		build( i , 1 , 1 , n );
	}
	for( int i = 0 ; i < len ; ++ i ){
		p = s[i] - 'a' + 1 ;
		update( p , 1 , 1 , n , i+1 , i+1 , 1 ); 
	}
	for( int i = 1 ; i <= m ; ++ i ){
		memset( cnt , 0 , sizeof(cnt));
		scanf( "%lld%lld" , &ll , &rr );
		for( int j = 1 ; j <= 26 ; ++ j ){
			cnt[j] = query( j , 1 , 1 , n , ll , rr );
		}
		int x = 0 ;
		int let = 0 ;//记录奇数个字符 
		for( int j = 1 ; j <= 26 ; ++ j ){
			if( cnt[j] % 2 != 0 ){
				x ++ ;
				let = j ;
				cnt[j] -- ;
			}
		}
		if( x > 1 ){
			continue ;
		}
		for( int j = 1 ; j <= 26 ; ++ j ){
			update( j , 1 , 1 , n , ll , rr , 0 );
			cnt[j] /= 2 ;
		}
		int ii = 0 ;
		for( int j = 1 ; j <= 26 ; ++ j ){
			update( cnt[j] , 1 , 1 , n , ll + ii , ll + ii , 1 );
			update( cnt[j] , 1 , 1 , n , rr - ii , rr - ii , 1 );
			cnt[j] -- ;
			s[ll+ii] = 'a' + j - 1 ;
			s[rr-ii] = 'a' + j - 1 ;
			if( cnt[j] > 0 ){
				j -- ;
			}
		}
	}
	cout << s << endl;
	return 0 ;
}
/*
7 2
aabcbaa
1 3
5 7

3 2
abc
1 2
2 3
*/

感谢大佬,好人一生平安!

2024/3/28 18:43
加载中...