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
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int>
#define INOPEN freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 2e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T;
int a, b, c, d; string s[4], ss; bool ok(string a, string b, string c) {
int lena = a.size(), lenb = b.size(), lenc = c.size();
int len = lena+lenb+lenc;
for(int i=0; i<7; i++) {
if(i&(1<<(0))) {
reverse(a.begin(), a.end());
}
if(i&(1<<(1))) {
reverse(b.begin(), b.end());
}
if(i&(1<<(2))) {
reverse(c.begin(), c.end());
}
ss = a+b+c;
if(i&(1<<(0))) {
reverse(a.begin(), a.end());
}
if(i&(1<<(1))) {
reverse(b.begin(), b.end());
}
if(i&(1<<(2))) {
reverse(c.begin(), c.end());
} int flag = 1;
for(int i=1; i<len; i++) {
if(abs(ss[i]-ss[i-1])!=1) {
flag = 0;
break;
}
}
if(flag) {
printf("YES\n");
for(int i=0; i<len; i++) {
printf("%c%c", ss[i], i==len-1 ? '\n':' ');
}
return true;
}
}
return false;
} int main() {
scanf("%d%d%d%d", &a, &b, &c, &d);
s[1] = "";
while(a&&b) {
s[1] += "01";
a--, b--;
}
if(a) {
s[1] += "0";
a--;
}
if(b) {
s[1] = "1"+s[1];
b--;
} s[3] = "";
while(c&&d) {
s[3] += "23";
c--, d--;
}
if(c) {
s[3] += "2";
c--;
}
if(d) {
s[3] = "3"+s[3];
d--;
} s[2] = "";
while(b&&c) {
s[2] += "12";
b--, c--;
}
if(b) {
s[2] += "1";
b--;
}
if(c) {
s[2] = "2"+s[2];
c--;
}
if(a||b||c||d) return 0*puts("NO");
do {
if(ok(s[1], s[2], s[3]))
return 0;
} while(next_permutation(s+1, s+1+3));
puts("NO");
return 0;
}

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
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int>
#define INOPEN freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 2e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 998244353;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T; int p[maxn]; ll fpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b&1) ans = ans*a%mod;
a = a*a%mod;
b >>= 1;
}
return ans;
} int main() {
ll M = fpow(100ll, mod-2);
scanf("%d", &n);
for(int i=1; i<=n; i++) {
scanf("%d", &p[i]);
}
ll b = 0, c = 0;
ll tmpb = 1;
for(int i=1; i<=n; i++) {
b += tmpb*(100ll-p[i])%mod*M%mod;
c += tmpb;
tmpb *= p[i]*M%mod;
b %= mod, c %=mod, tmpb %= mod;
}
b = mod-b+1;
b = (b%mod+mod)%mod;
ll ans = c*fpow(b, mod-2)%mod;
printf("%lld\n", ans);
return 0;
}

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
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int>
#define INOPEN freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 2e3 + 10;
const int maxm = 1e5 + 10;
const ll mod = 998244353;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m, TT;
int cas, tol; int a[maxn] = {0};
char s[maxn];
ll dp[maxn][maxn]; ll fpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b&1) ans = ans*a%mod;
a = a*a%mod;
b >>= 1;
}
return ans;
} int main() {
scanf("%s", s+1);
n = strlen(s+1);
for(int i=1; i<=n; i++) {
a[i] = a[i-1]+(s[i]=='?');
dp[i][i] = 0;
dp[i][i+1] = (i+1<=n && s[i]!=')' && s[i+1]!='(');
}
for(int d=3; d<=n; d++) {
for(int i=1, j=d, c; j<=n; i++, j++) {
dp[i][j] = 0, c = -1;
if(s[i] != ')') {
if(s[j] != ')') dp[i][j] += dp[i][j-1], c++;
if(s[j] != '(') dp[i][j] += dp[i+1][j-1] + fpow(2, a[j-1]-a[i]);
}
if(s[i] != '(') {
if(s[j] != ')') dp[i][j] += dp[i+1][j-1], c++;
if(s[j] != '(') dp[i][j] += dp[i+1][j], c++;
}
dp[i][j] -= max(c, 0)*dp[i+1][j-1];
dp[i][j] %= mod;
// printf("dp[%d][%d] = %lld\n", i, j, dp[i][j]);
}
}
printf("%lld\n", dp[1][n]);
return 0;
}

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. 第01组 Beta版本演示

    目录 1.1 本组成员 1.2 工作流程.组员分工.组员工作量比例 1.3 GitHub 项目链接 1.4 本组 Beta 冲刺站立会议博客链接汇总 1.5 燃尽图 1.6 原计划.达成情况及原因分析 ...

  2. 公式推导【ASRCF//CVPR2019】

    Dai K, Wang D, Lu H, et al. Visual Tracking via Adaptive Spatially-Regularized Correlation Filters[C ...

  3. 【Spring】Spring框架配置详情

    Spring框架的一个亮点就是能实现注入并且可以对实例化的Bean进行管理. 本文将对Spring框架的配置做一个详细的讲解. 一般情况下Spring是不单独使用的,而是和Hibernate配合使用, ...

  4. markdown 希腊字母

    字母名称 大写 markdown原文 小写 markdown原文alpha A A α \alphabeta B B β \betagamma Γ \Gamma γ \gammadelta Δ \De ...

  5. 微信小程序开发语音识别文字教程

    微信小程序开发语音识别文字教程 现在后台 添加插件 微信同声传译 然后app.json 加入插件 "plugins": { "WechatSI": { &quo ...

  6. jquery ajax怎么使用jsonp跨域访问

    在项目中使用接口的比较多,在客户端跨域访问,jquery中只能使用jquery ajax的jsonp方法. 值得注意的是,jQuery.ajax()只支持get方式的跨域,post的方式是不支持的.& ...

  7. JS解决所有浏览器连续输入英文字母不换行问题,包括火狐(转)

    问题描述: <p style="font-size:12px;line-height:30px;">测试数据测试数据</p> p标签内如果输入一长段英文字符 ...

  8. 休谟:《人性论》一书中提出的要重视"是"与"应该"的区别

    "价值"最初是经济学的范畴,指的是经济价值.商品价值.价值作的为一个哲学概念,首先大概是由18 世纪的英国哲学家休谟(David H ume,1711-1776)提出的.他于173 ...

  9. 如何利用 VisualStudio2019 遠端工具進行偵錯

    Hi 這次要來介紹 如何使用 Visual Studio 2019 遠端工具進行 Release 應用程式偵錯 首先我們先下載 2019 專用的遠端工具(這裡依照不同的 VisualStudio 版本 ...

  10. 2019 北森java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.北森等公司offer,岗位是Java后端开发,因为发展原因最终选择去了北森,入职一年时间了,也成为了面试官,之 ...