蒟蒻发现墓前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
*/
感谢大佬,好人一生平安!