A:msc和mas
solved.
考虑斐波那契数列,即最多加45次即会超过1e9,直接暴力即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a, b, l; 5 6 int solve(int st) 7 { 8 int A = a, B = b; 9 while (1) 10 { 11 if (st == 1) 12 { 13 if (A > l) return printf("Yes"); 14 else 15 { 16 int B0 = B; 17 while (B < 2 * B0) B += A; 18 } 19 } 20 else 21 { 22 if (B > l) return printf("No"); 23 else 24 { 25 int A0 = A; 26 while (A < 2 * A0) A += B; 27 } 28 } 29 st ^= 1; 30 } 31 } 32 33 int main() 34 { 35 while (scanf("%d%d%d", &a, &b, &l) != EOF) 36 { 37 solve(1); putchar(' '); 38 solve(0); putchar('\n'); 39 } 40 return 0; 41 }
B:msc和mcc
solved.
考虑如果有一个区间满足,那么左右两边扩展区间肯定也是满足的
再考虑从左到右,如果$1-x满足,那么2-y满足的话, 显然有y >= x$
那么只需要双指针找到以i为左界,找到最近的右界,那么这个点的贡献就是n - r + 1
再考虑怎么判断是否合法
不难发现,只有mscmcc 和 mccmsc 两种情况,注意其中可以加入其他字符,但是最终取出的子序列都会归结到这两种情况 都判断一下即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 #define N 100010 6 int n; 7 char str[N]; 8 set <int> m, s, c; 9 int st_m[2], pos_s, pos_c[2]; 10 11 bool check1() 12 { 13 // mscmcc 14 if (s.upper_bound(st_m[0]) == s.end()) return false; 15 pos_s = *s.upper_bound(st_m[0]); 16 if (c.upper_bound(pos_s) == c.end()) return false; 17 pos_c[0] = *c.upper_bound(pos_s); 18 if (c.upper_bound(max(st_m[1], pos_c[0])) == c.end()) return false; 19 pos_c[1] = *c.upper_bound(max(st_m[1], pos_c[0])); 20 if (c.upper_bound(pos_c[1]) == c.end()) return false; 21 return true; 22 } 23 24 bool check2() 25 { 26 // mccmsc 27 if (c.upper_bound(st_m[0]) == c.end()) return false; 28 pos_c[0] = *c.upper_bound(st_m[0]); 29 if (c.upper_bound(pos_c[0]) == c.end()) return false; 30 pos_c[1] = *c.upper_bound(pos_c[0]); 31 if (s.upper_bound(st_m[1]) == s.end()) return false; 32 pos_s = *s.upper_bound(st_m[1]); 33 if (c.upper_bound(max(pos_s, pos_c[1])) == c.end()) return false; 34 return true; 35 } 36 37 bool ok() 38 { 39 if (m.size() < 2) return false; 40 if (s.size() < 1) return false; 41 if (c.size() < 3) return false; 42 st_m[0] = *m.begin(); m.erase(m.begin()); 43 st_m[1] = *m.begin(); m.insert(st_m[0]); 44 if (check1()) return true; 45 if (check2()) return true; 46 return false; 47 } 48 49 int main() 50 { 51 while (scanf("%d", &n) != EOF) 52 { 53 m.clear(); s.clear(); c.clear(); 54 ll res = 0; 55 scanf("%s", str + 1); 56 for (int i = 1, r = 0; i <= n; ++i) 57 { 58 while (r < n && !ok()) 59 { 60 ++r; 61 if (str[r] == 'm') m.insert(r); 62 else if (str[r] == 's') s.insert(r); 63 else c.insert(r); 64 } 65 if (!ok()) break; 66 res += n - r + 1; 67 if (str[i] == 'm') m.erase(i); 68 else if (str[i] == 's') s.erase(i); 69 else c.erase(i); 70 } 71 printf("%lld\n", res); 72 } 73 return 0; 74 }
C:msc的宠物
unsolved.
D:msc的背包
unsolved.
E:msc的序列
unsolved.
F:msc的无向图
unsolved.