Codeforces 570C 贪心
题目:http://codeforces.com/contest/570/problem/C
题意:给你一个字符串,由‘.’和小写字母组成。把两个相邻的‘.’替换成一个‘.’,算一次变换。现在给你一些个操作,操作内容是把某个位置的字符变成给定的 字符,求出每次操作后,需要多少次
变换才能把原串所有相邻的‘.’变成一个‘.’。注意,每次操作是累加的,即一次操作就会把原串替换一个字符。
分析:先求出原串的变换次数sum,然后每次询问的时候,直接看他的两边是否是".",如果是"."num++。因为是累加的,所以在每次循环过后需要更新字符串以及sum。
1 #include <cstdio> 2 #include <iostream> 3 #include <sstream> 4 #include <cmath> 5 #include <cstring> 6 #include <cstdlib> 7 #include <string> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <queue> 12 #include <stack> 13 #include <algorithm> 14 using namespace std; 15 #define ll long long 16 #define _cle(m, a) memset(m, a, sizeof(m)) 17 #define repu(i, a, b) for(int i = a; i < b; i++) 18 #define repd(i, a, b) for(int i = b; i >= a; i--) 19 #define sfi(n) scanf("%d", &n) 20 #define pfi(n) printf("%d\n", n) 21 #define N 100010 22 string s; 23 vector<int> p[N]; 24 int main() 25 { 26 int n,m; 27 while(~scanf("%d%d",&n,&m)) 28 { 29 cin>>s; 30 int flag = 0,t,sum = 0; 31 repu(i,0,n) 32 { 33 if(s[i] == '.' && !flag) 34 { 35 flag = 1; 36 t = i; 37 } 38 else if(flag && s[i] != '.') 39 { 40 sum += (i-t-1); 41 flag = 0; 42 } 43 } 44 if(flag) 45 sum += (n-t-1); 46 //printf("%d\n",sum); 47 char p; 48 int num = sum,a; 49 repu(i,0,m) 50 { 51 scanf("%d %c",&a,&p); 52 if(p != '.') 53 { 54 if(s[a-1] != '.') 55 num = sum; 56 else 57 { 58 if(a-2 >= 0 && s[a-2] == '.') 59 num--; 60 if(s[a] == '.' && a < n) 61 num--; 62 } 63 s[a-1] = p; 64 sum = num; 65 } 66 else 67 { 68 if(s[a-1] == '.') 69 num = sum; 70 else 71 { 72 if(a-2 >= 0 && s[a-2] == '.') 73 num++; 74 if(s[a] == '.' && a < n) 75 num++; 76 } 77 s[a-1] = p; 78 sum = num; 79 } 80 printf("%d\n",num); 81 } 82 } 83 return 0; 84 }
人生就像心电图,想要一帆风顺,除非game-over