Beautiful Sequence

\[Time Limit: 1000 ms\quad Memory Limit: 256 MB
\]

首先我们可以考虑到 \(0\) 只能 和 \(1\) 放在一起、\(3\) 只能和 \(2\) 放在一起,那么我们想办法先把 \(0\) 和 \(3\) 凑出来,最后就剩下 \(1\) 和 \(2\) 了,我们只要把他们放在一起就可以了。

所以我们可以贪心考虑三个 \(string\),分别长成 \(0101...0101\)、\(2323...2323\)、\(1212...1212\) 这样的,那么现在的问题就是把这三个 \(string\) 合并起来,那么完全可以把他们全排列并二进制枚举每个 \(string\) 是否翻转,然后 \(check\) 一遍。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 1e9 + 7;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. int a, b, c, d;
  38. string s[4], ss;
  39. bool ok(string a, string b, string c) {
  40. int lena = a.size(), lenb = b.size(), lenc = c.size();
  41. int len = lena+lenb+lenc;
  42. for(int i=0; i<7; i++) {
  43. if(i&(1<<(0))) {
  44. reverse(a.begin(), a.end());
  45. }
  46. if(i&(1<<(1))) {
  47. reverse(b.begin(), b.end());
  48. }
  49. if(i&(1<<(2))) {
  50. reverse(c.begin(), c.end());
  51. }
  52. ss = a+b+c;
  53. if(i&(1<<(0))) {
  54. reverse(a.begin(), a.end());
  55. }
  56. if(i&(1<<(1))) {
  57. reverse(b.begin(), b.end());
  58. }
  59. if(i&(1<<(2))) {
  60. reverse(c.begin(), c.end());
  61. }
  62. int flag = 1;
  63. for(int i=1; i<len; i++) {
  64. if(abs(ss[i]-ss[i-1])!=1) {
  65. flag = 0;
  66. break;
  67. }
  68. }
  69. if(flag) {
  70. printf("YES\n");
  71. for(int i=0; i<len; i++) {
  72. printf("%c%c", ss[i], i==len-1 ? '\n':' ');
  73. }
  74. return true;
  75. }
  76. }
  77. return false;
  78. }
  79. int main() {
  80. scanf("%d%d%d%d", &a, &b, &c, &d);
  81. s[1] = "";
  82. while(a&&b) {
  83. s[1] += "01";
  84. a--, b--;
  85. }
  86. if(a) {
  87. s[1] += "0";
  88. a--;
  89. }
  90. if(b) {
  91. s[1] = "1"+s[1];
  92. b--;
  93. }
  94. s[3] = "";
  95. while(c&&d) {
  96. s[3] += "23";
  97. c--, d--;
  98. }
  99. if(c) {
  100. s[3] += "2";
  101. c--;
  102. }
  103. if(d) {
  104. s[3] = "3"+s[3];
  105. d--;
  106. }
  107. s[2] = "";
  108. while(b&&c) {
  109. s[2] += "12";
  110. b--, c--;
  111. }
  112. if(b) {
  113. s[2] += "1";
  114. b--;
  115. }
  116. if(c) {
  117. s[2] = "2"+s[2];
  118. c--;
  119. }
  120. if(a||b||c||d) return 0*puts("NO");
  121. do {
  122. if(ok(s[1], s[2], s[3]))
  123. return 0;
  124. } while(next_permutation(s+1, s+1+3));
  125. puts("NO");
  126. return 0;
  127. }

Beautiful Mirrors

\[Time Limit: 2000 ms\quad Memory Limit: 256 MB
\]

首先令 \(dp[i]\) 表示从第 \(i\) 天到结束所需要的期望天数,为了方便,可以假设 \(n+1\) 天为结束位置,那么 \(dp[n+1] = 0\)。

对于 \(1<=i<=n\),有 \(dp[i] = \frac{p_i*dp[i+1] + (100-p_i)*dp[1]}{100}+1\)

然后一直带进去,最后可以发现 \(dp[1]\) 可以表示为

\[ dp[1] = A*dp[1] + B + 1
\]

其中 \(A、B\) 都是具体的数字,那么就得到的 \(dp[1]\) 的值。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e5 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 998244353;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m;
  36. int cas, tol, T;
  37. int p[maxn];
  38. ll fpow(ll a, ll b) {
  39. ll ans = 1;
  40. while(b) {
  41. if(b&1) ans = ans*a%mod;
  42. a = a*a%mod;
  43. b >>= 1;
  44. }
  45. return ans;
  46. }
  47. int main() {
  48. ll M = fpow(100ll, mod-2);
  49. scanf("%d", &n);
  50. for(int i=1; i<=n; i++) {
  51. scanf("%d", &p[i]);
  52. }
  53. ll b = 0, c = 0;
  54. ll tmpb = 1;
  55. for(int i=1; i<=n; i++) {
  56. b += tmpb*(100ll-p[i])%mod*M%mod;
  57. c += tmpb;
  58. tmpb *= p[i]*M%mod;
  59. b %= mod, c %=mod, tmpb %= mod;
  60. }
  61. b = mod-b+1;
  62. b = (b%mod+mod)%mod;
  63. ll ans = c*fpow(b, mod-2)%mod;
  64. printf("%lld\n", ans);
  65. return 0;
  66. }

Beautiful Bracket Sequence (easy version)

\[Time Limit: 2000 ms\quad Memory Limit: 256 MB
\]

令 \(dp[i][j]\) 表示从 \(i\) 到 \(j\) 区间内,所有情况的括号最深深度之和。

转移的时候令 \(dp[i][i] = 0\),\(dp[i][i+1]\) 为 \(s[i]\) 和 \(s[i+1]\) 能否组成 \(()\)。

对于更大的区间,只需要考虑最左和最右端点就可以。

  1. 如果\(s[i]\) 可以放成 \((\)

    • 如果 \(s[j]\) 可以放成 \((\),\(dp[i][j] += dp[i][j-1]\)
    • 如果 \(s[j]\) 可以放成 \()\),\(dp[i][j] += dp[i+1][j-1] + 2^k\),\(k\) 代表 \([i+1,j-1]\) 这段内 \(?\) 的个数。
  2. 如果 \(s[i]\) 可以放成 \()\)

    • 如果 \(s[j]\) 可以放成 \((\),\(dp[i][j] += dp[i+1][j-1]\)
    • 如果 \(s[j]\) 可以放成 \()\),\(dp[i][j] += dp[i+1][j]\)

然后有一部分会被重复计算,也就是 \(dp[i+1][j-1]\) 这一段,所以只要顺便记录一下转移过程中计算了几次这一段,然后扣掉多计算的就可以了。

view
  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define pii pair<int, int>
  23. #define INOPEN freopen("in.txt", "r", stdin)
  24. #define OUTOPEN freopen("out.txt", "w", stdout)
  25. typedef unsigned long long int ull;
  26. typedef long long int ll;
  27. const int maxn = 2e3 + 10;
  28. const int maxm = 1e5 + 10;
  29. const ll mod = 998244353;
  30. const ll INF = 1e18 + 100;
  31. const int inf = 0x3f3f3f3f;
  32. const double pi = acos(-1.0);
  33. const double eps = 1e-8;
  34. using namespace std;
  35. int n, m, TT;
  36. int cas, tol;
  37. int a[maxn] = {0};
  38. char s[maxn];
  39. ll dp[maxn][maxn];
  40. ll fpow(ll a, ll b) {
  41. ll ans = 1;
  42. while(b) {
  43. if(b&1) ans = ans*a%mod;
  44. a = a*a%mod;
  45. b >>= 1;
  46. }
  47. return ans;
  48. }
  49. int main() {
  50. scanf("%s", s+1);
  51. n = strlen(s+1);
  52. for(int i=1; i<=n; i++) {
  53. a[i] = a[i-1]+(s[i]=='?');
  54. dp[i][i] = 0;
  55. dp[i][i+1] = (i+1<=n && s[i]!=')' && s[i+1]!='(');
  56. }
  57. for(int d=3; d<=n; d++) {
  58. for(int i=1, j=d, c; j<=n; i++, j++) {
  59. dp[i][j] = 0, c = -1;
  60. if(s[i] != ')') {
  61. if(s[j] != ')') dp[i][j] += dp[i][j-1], c++;
  62. if(s[j] != '(') dp[i][j] += dp[i+1][j-1] + fpow(2, a[j-1]-a[i]);
  63. }
  64. if(s[i] != '(') {
  65. if(s[j] != ')') dp[i][j] += dp[i+1][j-1], c++;
  66. if(s[j] != '(') dp[i][j] += dp[i+1][j], c++;
  67. }
  68. dp[i][j] -= max(c, 0)*dp[i+1][j-1];
  69. dp[i][j] %= mod;
  70. // printf("dp[%d][%d] = %lld\n", i, j, dp[i][j]);
  71. }
  72. }
  73. printf("%lld\n", dp[1][n]);
  74. return 0;
  75. }

Codeforces Round #604 (Div. 2) D、E、F题解的更多相关文章

  1. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学

    题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...

  2. Codeforces Round #725 (Div. 3) A-D,F题解

    A. Stone Game 思路:总共3种情况,都从最左端被拿走,都从最右端被拿走,左侧的从最左端被拿走且右侧的从最右端被拿走,取最小值即可 代码: //CF-725.A #include<bi ...

  3. Codeforces Round #604 (Div. 2) 练习A,B题解

    A题 链接 思路分析: 因为只需要做到相邻的不相同,利用三个不同的字母是肯定可以实现的, 所以直接先将所有的问号进行替换,比如比前一个大1,如果与后面的冲突,则再加一 代码(写的很烂): #inclu ...

  4. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  5. Codeforces Round #376 (Div. 2) C D F

    在十五楼做的cf..一会一断...比赛的时候做出了ABCF 就没有时间了 之后没看题解写出了D..E是个神奇的博弈(递推或者dp?)看了题解也没有理解..先写了CDF.. C 有n个袜子 每个袜子都有 ...

  6. Codeforces Round #604(Div. 2,

    // https://codeforces.com/contest/1265/problem/D /* 感觉像是遍历的思维构造题 有思路就很好做的 可以把该题想象成过山车或者山峰...... */ # ...

  7. Codeforces Round #604 (Div. 2) (题解)

    A. Beautiful String (暴力) 题目链接 题目大意: 给定一个字符串,只有 \(?a\ b\ c\ ?\) ,问是否存在一种将所有的 \(?\) 替换成 \(a\ b\ c\) ,使 ...

  8. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors

    链接: https://codeforces.com/contest/1265/problem/E 题意: Creatnx has n mirrors, numbered from 1 to n. E ...

  9. Codeforces Round #604 (Div. 2) D. Beautiful Sequence(构造)

    链接: https://codeforces.com/contest/1265/problem/D 题意: An integer sequence is called beautiful if the ...

随机推荐

  1. zlib压缩相关

    相关原理 deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码: zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有z ...

  2. com.alibaba.fastjson.JSONObject之对象与JSON转换方法

    com.alibaba.fastjson.JSONObject时经常会用到它的转换方法,包括Java对象转成JSON串.JSON对象,JSON串转成java对象.JSON对象,JSON对象转换Java ...

  3. 关于 C# 8.0 的 Switch Case When 的用法

    直接贴代码了: static void Main(string[] args) { SwitchSample(); } private static void SwitchSample() { Swi ...

  4. Python getopt 模块

    Python getopt 模块 getopt模块,是配合sys.argv使用的一个扩展.他可以接收终端的参数.格式扩展为“-n” 或 “--n”两种类型,下面是具体解释. 使用 improt get ...

  5. JavaScript的__proto__、prototype和继承

    JavaScript也是可以“继承”的! 各位看官或是好奇,或是一知半解.什么是prototype,__proto__,constructor.哪种继承方式好.今天就在这交流交流. 什么是protot ...

  6. SQL Server中,如何查看每个数据库的Owner是哪个SQL Server账户,也就是谁创建的

    有时候我们作为SQL Server的DBA,会需要查找每个数据库的Owner是哪个SQL Server账户,也就是谁创建的. 我们可以使用系统存储过程"sys.sp_helpdb" ...

  7. Python笔记:threading(多线程操作)

    Python的线程操作在旧版本中使用的是thread模块,在Python27和Python3中引入了threading模块,同时thread模块在Python3中改名为_thread模块,thread ...

  8. Codeforces 939A题,B题(水题)

    题目链接:http://codeforces.com/problemset/problem/939/A A题 A. Love Triangle time limit per test 1 second ...

  9. PDO封装增删改查

    <?phpclass db{ public $table=null; public $pdo; public $where=null; //where 条件 public $field=null ...

  10. jquery根据下拉框选择的值显示输入框

    原理就是根据下拉框选择的值来控制显示那个输入框: html代码: 首先定义一个下拉框,$serviceTypeList就是后台传过来的所有属性, <div class="uk-form ...