[关闭]
@Dmaxiya 2018-08-17T10:18:18.000000Z 字数 3483 阅读 1043

Codeforces Round #463 (Div. 1 + Div. 2)

Codeforces


Contests 链接:Codeforces Round #463 (Div. 1 + Div. 2)
过题数:2
排名:2093/8251

A. Palindromic Supersequence

题意

给定一个字符串 ,构造一个字符串 ,使得字符串 是回文串,且 的子序列。

输入

输入只包含一个字符串

输出

输出字符串 ,字符串 的长度不必是最短的,只需要在 以内即可。

样例

输入 输出 提示
aba aba "aba" 是 "aba" 的子序列,且 "aba" 是一个回文串。
ab aabaa "ab" 是 "aabaa" 的子序列,且 "aabaa" 是一个回文串。

题解

正着输出一遍 再倒着输出一遍 ,就是答案,因为 ,所以答案最多只有 个字符。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. using namespace std;
  17. #define LL long long
  18. const int maxn = 1000 + 100;
  19. int len;
  20. char str[maxn];
  21. int main() {
  22. #ifdef Dmaxiya
  23. freopen("test.txt", "r", stdin);
  24. #endif // Dmaxiya
  25. while(scanf("%s", str) != EOF) {
  26. len = strlen(str);
  27. printf("%s", str);
  28. for(int i = len - 1; i >= 0; --i) {
  29. printf("%c", str[i]);
  30. }
  31. printf("\n");
  32. }
  33. return 0;
  34. }

B. Recursive Queries

题意

定义函数 ,表示数字 的所有数位上非零数值的乘积,定义函数 如下:


次询问,每次询问区间 内, 的个数。

输入

第一行为一个整数 ,表示询问的次数,接下去 行,每行三个整数

输出

对于每次询问输出所求答案。

样例

输入 输出 提示
4
22 73 9
45 64 6
47 55 7
2 62 4
1
4
0
8
1.
2.
3.在 之间没有 的数字;
4.
4
82 94 6
56 67 4
28 59 9
39 74 4
3
1
1
5

题解

预处理出 内所有的 ,对 的个数分别做前缀和,就可以 地查询。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. using namespace std;
  17. #define LL long long
  18. const int maxn = 1000000 + 100;
  19. int T, l, r, k;
  20. int g[maxn];
  21. int sum[maxn][10];
  22. int f(int x) {
  23. int ret = 1;
  24. while(x != 0) {
  25. if(x % 10 != 0) {
  26. ret *= x % 10;
  27. }
  28. x /= 10;
  29. }
  30. return ret;
  31. }
  32. int main() {
  33. #ifdef Dmaxiya
  34. freopen("test.txt", "r", stdin);
  35. #endif // Dmaxiya
  36. for(int i = 1; i < maxn; ++i) {
  37. if(i < 10) {
  38. g[i] = i;
  39. } else {
  40. g[i] = g[f(i)];
  41. }
  42. for(int j = 1; j <= 9; ++j) {
  43. sum[i][j] = sum[i - 1][j];
  44. }
  45. ++sum[i][g[i]];
  46. }
  47. while(scanf("%d", &T) != EOF) {
  48. while(T--) {
  49. scanf("%d%d%d", &l, &r, &k);
  50. printf("%d\n", sum[r][k] - sum[l - 1][k]);
  51. }
  52. }
  53. return 0;
  54. }

C. Permutation Cycle

题意

对于一个排列 ,定义函数 为:


定义函数 为使 的最小的 的值,对于给定的整数 ,构造一种排列,使得

输入

输入只包含三个整数

输出

输出 的一种满足题意的排列。

样例

输入 输出 提示
9 2 5 6 5 8 3 4 1 9 2 7
3 2 1 1 2 3

题解

将每一个数字 与其对应的下标连一条边,在全排列中就是一个个环,每一个 都属于其中一个环,可以发现 就是第 个数字所在环的节点数量,因此就是要构造一个序列,使这个序列中环的数量要么是 要么是 ,所以相当于是要解一个方程,使得 ,且 ,其中 表示环上节点个数等于 的环的数量, 表示环上节点个数等于 的环的数量,由于数据范围比较小,可以暴力跑出 的值,最后构造出这些环即可。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. using namespace std;
  17. #define LL long long
  18. const int maxn = 1000000 + 100;
  19. int n, a, b, cnta, cntb;
  20. int num[maxn], ans[maxn];
  21. void Move(int Index, int cnt, int x) {
  22. for(int i = 0; i < cnt; ++i) {
  23. ans[Index] = num[Index + x - 1];
  24. for(int j = 1; j < x; ++j) {
  25. ans[Index + j] = num[Index + j - 1];
  26. }
  27. Index += x;
  28. }
  29. }
  30. int main() {
  31. #ifdef Dmaxiya
  32. freopen("test.txt", "r", stdin);
  33. #endif // Dmaxiya
  34. while(scanf("%d%d%d", &n, &a, &b) != EOF) {
  35. cnta = cntb = -1;
  36. for(int i = 0; i <= n; i += a) {
  37. if((n - i) % b == 0) {
  38. cnta = i / a;
  39. cntb = (n - i) / b;
  40. }
  41. }
  42. if(cnta == -1) {
  43. printf("-1\n");
  44. continue;
  45. }
  46. for(int i = 1; i <= n; ++i) {
  47. num[i] = i;
  48. }
  49. Move(1, cnta, a);
  50. Move(1 + cnta * a, cntb, b);
  51. for(int i = 1; i <= n; ++i) {
  52. if(i != 1) {
  53. printf(" ");
  54. }
  55. printf("%d", ans[i]);
  56. }
  57. printf("\n");
  58. }
  59. return 0;
  60. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注