Codeforces Round #316 (Div. 2C) 570C Replacement
题目:Click here
题意:看一下题目下面的Note就会明白的。
分析:一开始想的麻烦了,用了树状数组(第一次用)优化,可惜没用。
直接判断:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int INF = 0x3f3f3f3f; 5 const int M = 3e5+3; 6 7 int n, m; 8 char str[M]; 9 int main() { 10 while( ~scanf("%d %d", &n, &m ) ) { 11 scanf("%s", str ); 12 int len = strlen( str ); 13 int ans = 0; 14 for( int i=1; i<len; i++ ) 15 if( str[i]==str[i-1] && str[i]=='.' ) 16 ans++; 17 for( int i=0; i<m; i++ ) { 18 int pos; char s; 19 scanf("%d %c", &pos, &s ); 20 pos--; 21 if( str[pos]=='.' && s!='.' ) { 22 if( pos>0 && str[pos-1]=='.' ) ans--; 23 if( pos<n-1 && str[pos+1]=='.' ) ans--; 24 } 25 else if( str[pos]!='.' && s=='.' ) { 26 if( pos>0 && str[pos-1]=='.' ) ans++; 27 if( pos<n-1 && str[pos+1]=='.' ) ans++; 28 } 29 str[pos] = s; 30 printf("%d\n", ans ); 31 } 32 } 33 return 0; 34 }
树状数组优化(上面的方法更快):
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int INF = 0x3f3f3f3f; 5 const int M = 3e5+3; 6 7 int n, m; 8 char str[M]; 9 int C[M]; 10 int query( int x ) { 11 int ret = 0; 12 while( x > 0 ) { 13 ret += C[x]; 14 x -= x&-x; 15 } 16 return ret; 17 } 18 void update( int x, int y ) { 19 while( x <= n ) { 20 C[x] += y; 21 x += x&-x; 22 } 23 } 24 int main() { 25 while( ~scanf("%d %d", &n, &m ) ) { 26 scanf("%s", str ); 27 int len = strlen( str ); 28 memset( C, 0, sizeof(C) ); 29 for( int i=1; i<len; i++ ) 30 if( str[i]==str[i-1] && str[i]=='.' ) 31 update( i, 1 ); 32 for( int i=0; i<m; i++ ) { 33 int pos; char s; 34 scanf("%d %c", &pos, &s ); 35 pos--; 36 if( str[pos]=='.' && s!='.' ) { 37 if( pos>0 && str[pos-1]=='.' ) update( pos, -1 ); 38 if( pos<n-1 && str[pos+1]=='.' ) update( pos+1, -1 ); 39 } 40 else if( str[pos]!='.' && s=='.' ) { 41 if( pos>0 && str[pos-1]=='.' ) update( pos, 1 ); 42 if( pos<n-1 && str[pos+1]=='.' ) update( pos+1, 1 ); 43 } 44 str[pos] = s; 45 printf("%d\n", query( len-1 ) ); 46 } 47 } 48 return 0; 49 }