Color Changing Sofa Gym - 101962B、Renan and Cirque du Soleil Gym - 101962C、Hat-Xor Gym - 101962E 、Rei do Cangaço Gym - 101962K 、Sorting Machine Gym - 101962M
Color Changing Sofa
题意:给你一个由字母构成的字符串a,再给你一个由0、1构成的字符串b。你需要在a字符串中找到一个可以放下b的位置,要保证b字符串中0对应a字符串的位置每一个字符相等。且b字符串中1对应a字符串的位置每一个字符相等。你也可以把b字符串反着放置(也就是如果b字符串为0100,你也可以把它当作0010)
输出可以找到多少符合要求的位置
题解:
暴力模拟可以放置的所有位置
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INF 0x3f3f3f3f; 5 6 char s[2100], a[2100], b[2100]; 7 int n, m; 8 bool check1(int pos) 9 { 10 char f1, f0; 11 for (int i = pos; i <= pos + m - 1; i++) 12 { 13 if (a[i - pos + 1] == '1') 14 f1 = s[i]; 15 if (a[i - pos + 1] == '0') 16 f0 = s[i]; 17 } 18 for (int i = pos; i <= pos + m - 1; i++) 19 { 20 if (a[i - pos + 1] == '1' && s[i] != f1) 21 return 0; 22 if (a[i - pos + 1] == '0' && s[i] != f0) 23 return 0; 24 } 25 return 1; 26 } 27 28 bool check2(int pos) 29 { 30 char f1, f0; 31 for (int i = pos; i <= pos + m - 1; i++) 32 { 33 if (b[i - pos + 1] == '1') 34 f1 = s[i]; 35 if (b[i - pos + 1] == '0') 36 f0 = s[i]; 37 } 38 for (int i = pos; i <= pos + m - 1; i++) 39 { 40 if (b[i - pos + 1] == '1' && s[i] != f1) 41 return 0; 42 if (b[i - pos + 1] == '0' && s[i] != f0) 43 return 0; 44 } 45 return 1; 46 } 47 int main() 48 { 49 scanf("%s", s + 1); 50 scanf("%s", a + 1); 51 n = strlen(s + 1); 52 m = strlen(a + 1); 53 for (int i = 1; i <= m; i++) 54 b[i] = a[m - i + 1]; 55 int res = 0; 56 for (int i = 1; i <= n - m + 1; i++) 57 { 58 if (check1(i)) 59 res++; 60 else if (check2(i)) 61 res++; 62 } 63 printf("%d\n", res); 64 65 return 0; 66 }
Renan and Cirque du Soleil
题意:
给你一个长度为n的数组a,找出来这个数组a的所有子集合,让这个子集合中的最大值减去最小值。把所有子集合的最大值-最小值加起来取模于1e9+7输出就可以
题解:
找规律,之后矩阵快速幂
a2=1
找到的规律是ai=2*ai-1+2i-(i+1)
找一个系数矩阵
| 2 1 -1 0 |
| 0 2 0 0 |
| 0 0 1 1 |
| 0 0 0 1 |
最后乘于
| 1 |
| 8 |
| 4 |
| 1 |
代码:
1 /* 2 * @Author: hesorchen 3 * @Date: 2020-11-21 17:26:53 4 * @LastEditTime: 2020-11-24 16:05:21 5 * @Description: 栽种绝处的花 6 */ 7 #include <bits/stdc++.h> 8 using namespace std; 9 const long long mod = 1e9 + 7; 10 #define INF 0x3f3f3f3f; 11 12 struct node 13 { 14 long long a[4][4]; 15 }; 16 void mes(node &d) 17 { 18 for (long long i = 0; i < 4; ++i) 19 { 20 for (long long j = 0; j < 4; ++j) 21 { 22 d.a[i][j] = 0; 23 } 24 } 25 } 26 void init(node &res) 27 { 28 mes(res); 29 for (long long i = 0; i < 4; ++i) 30 { 31 res.a[i][i] = 1; 32 } 33 } 34 node mul(node b, node c) 35 { 36 node d; 37 mes(d); 38 for (long long i = 0; i < 4; ++i) 39 { 40 for (long long j = 0; j < 4; ++j) 41 { 42 for (long long k = 0; k < 4; ++k) 43 { 44 d.a[i][j] = (d.a[i][j] + ((b.a[i][k] * c.a[k][j]) % mod)) % mod; 45 } 46 } 47 } 48 return d; 49 } 50 node quick(node a, long long b) 51 { 52 node res; 53 init(res); 54 while (b) 55 { 56 if (b & 1) 57 { 58 res = mul(res, a); 59 } 60 a = mul(a, a); 61 b >>= 1; 62 } 63 return res; 64 } 65 int main() 66 { 67 long long t; 68 scanf("%lld", &t); 69 while (t--) 70 { 71 long long n; 72 scanf("%lld", &n); 73 if (n == 1) 74 { 75 printf("0\n"); 76 continue; 77 } 78 if (n == 2) 79 { 80 printf("1\n"); 81 continue; 82 } 83 84 node b; 85 b.a[0][0] = 2; 86 b.a[0][1] = 1; 87 b.a[0][2] = -1; 88 b.a[0][3] = 0; 89 90 b.a[1][0] = 0; 91 b.a[1][1] = 2; 92 b.a[1][2] = 0; 93 b.a[1][3] = 0; 94 95 b.a[2][0] = 0; 96 b.a[2][1] = 0; 97 b.a[2][2] = 1; 98 b.a[2][3] = 1; 99 100 b.a[3][0] = 0; 101 b.a[3][1] = 0; 102 b.a[3][2] = 0; 103 b.a[3][3] = 1; 104 105 node res = quick(b, n - 2); 106 printf("%lld\n", (mod * 4 + res.a[0][0] + (res.a[0][1] * 8ll) % mod + res.a[0][2] * 4ll + res.a[0][3] * 1ll) % mod); 107 } 108 return 0; 109 } 110 111 //979641140
Hat-Xor
这个题目有点看不懂
代码:
1 #include <algorithm> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <ctime> 7 #include <iostream> 8 #include <map> 9 #include <queue> 10 #include <set> 11 #include <vector> 12 using namespace std; 13 typedef long long ll; 14 const int maxn = 2e5 + 5; 15 const int mod = 998244353; 16 const double inf = 100000000005; 17 void read(int& v) { 18 int k = 1; 19 v = 0; 20 int c = getchar(); 21 while (c < '0' || c > '9') { 22 if (c == '-') 23 k = 0; 24 c = getchar(); 25 } 26 while (c >= '0' && c <= '9') 27 v = (v << 3) + (v << 1) + (c - 48), c = getchar(); 28 if (k == 0) 29 v = -v; 30 } 31 int main() { 32 // int t; 33 // read(t); 34 // while (t--) { 35 string s; 36 cin >> s; 37 int n = s.size(), ans = 0; 38 for (int i = 0; i < n; i++) 39 ans ^= s[i] - '0'; 40 if (!ans) 41 puts("YES"); 42 else 43 puts("NO"); 44 // } 45 } 46 /* 47 6 48 1 1 1 2 49 2 3 3 4 50 3 5 4 6 51 4 7 8 10 52 4 7 8 10 53 4 7 8 10 54 4 55 1 2 1 1 56 1 3 1 2 57 2 3 2 4 58 3 3 4 4 59 */
Rei do Cangaço
题意:
有n个房子,每一个房子里面有一定价值的财宝(有正有负)。如果你最开始站在第i个房子前,第一次你可以走3步到达i+3房子前,第二次你需要走6步,依次递增。你可以选择把[i,i+移动量)这一部分的房子的财宝都拿走。或者不拿
当你走过第n个房子就结束,对于每一个起始位置i,输出它的最大获利价值
题解:
模拟
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INF 0x3f3f3f3f; 5 #define mod 1000000007; 6 7 int a[50010]; 8 int sum[50010]; 9 int main() 10 { 11 int n; 12 scanf("%d", &n); 13 for (int i = 1; i <= n; i++) 14 scanf("%d", &a[i]); 15 for (int i = 1; i <= n; i++) 16 sum[i] = sum[i - 1] + a[i]; 17 for (int i = 1; i <= n; i++) 18 { 19 int ct = 3, pre = i, ans = 0; 20 for (int j = i + 3;; j += ct) 21 { 22 if (sum[min(n, j - 1)] - sum[pre - 1] > 0) 23 { 24 ans += sum[min(n, j - 1)] - sum[pre - 1]; 25 } 26 pre = j; 27 ct += 3; 28 if (j > n) 29 break; 30 } 31 printf("%d\n", ans); 32 } 33 34 return 0; 35 }
Sorting Machine
题意:
题目设定对一个区间排序花费是L*⌈log2(K+1)⌉
题目最开始给你一个倒着的序列a,其值如下:n、n-1、n-2...2、1
k就是你要排序的区间内ai>ai+1的数对的数量,L就是要排序区间长度
你要保证对整个区间排序的花费不超过7*n
对于输出你可以分成多组,前面组先输出表示在前面组已经排过序的基础上进行了下一组的排序
题解:
按照建线段树的形式输出线段树前三层就可以了,这个样子的话最后花费是不会超过7n的
打表也可以验证
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INF 0x3f3f3f3f; 5 6 struct node 7 { 8 int l, r; 9 } a[10]; 10 int main() 11 { 12 13 14 int n; 15 scanf("%d", &n); 16 a[1].l = 1; 17 a[1].r = n; 18 int mid = a[1].l + a[1].r >> 1; 19 a[2].l = 1; 20 a[2].r = mid; 21 a[3].l = mid + 1; 22 a[3].r = n; 23 mid = a[2].l + a[2].r >> 1; 24 a[4].l = 1; 25 a[4].r = mid; 26 a[5].l = mid + 1; 27 a[5].r = a[2].r; 28 mid = a[3].l + a[3].r >> 1; 29 a[6].l = a[3].l; 30 a[6].r = mid; 31 a[7].l = mid + 1; 32 a[7].r = n; 33 34 printf("%d\n", 3); 35 printf("%d\n", 4); 36 printf("%d %d\n", a[4].l, a[4].r); 37 printf("%d %d\n", a[5].l, a[5].r); 38 printf("%d %d\n", a[6].l, a[6].r); 39 printf("%d %d\n", a[7].l, a[7].r); 40 41 printf("%d\n", 2); 42 printf("%d %d\n", a[2].l, a[2].r); 43 printf("%d %d\n", a[3].l, a[3].r); 44 45 printf("%d\n", 1); 46 printf("%d %d\n", a[1].l, a[1].r); 47 return 0; 48 }