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 }
View Code

 

posted @ 2015-08-14 15:41  TaoTaoCome  阅读(122)  评论(0编辑  收藏  举报