Codeforces Round #604 (Div. 2) D、E、F题解
Beautiful Sequence
\]
首先我们可以考虑到 \(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
\]
首先令 \(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]\) 可以表示为
\]
其中 \(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)
\]
令 \(dp[i][j]\) 表示从 \(i\) 到 \(j\) 区间内,所有情况的括号最深深度之和。
转移的时候令 \(dp[i][i] = 0\),\(dp[i][i+1]\) 为 \(s[i]\) 和 \(s[i+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]\) 这段内 \(?\) 的个数。
如果 \(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题解的更多相关文章
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...
- Codeforces Round #725 (Div. 3) A-D,F题解
A. Stone Game 思路:总共3种情况,都从最左端被拿走,都从最右端被拿走,左侧的从最左端被拿走且右侧的从最右端被拿走,取最小值即可 代码: //CF-725.A #include<bi ...
- Codeforces Round #604 (Div. 2) 练习A,B题解
A题 链接 思路分析: 因为只需要做到相邻的不相同,利用三个不同的字母是肯定可以实现的, 所以直接先将所有的问号进行替换,比如比前一个大1,如果与后面的冲突,则再加一 代码(写的很烂): #inclu ...
- Codeforces Round #609 (Div. 2)前五题题解
Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...
- Codeforces Round #376 (Div. 2) C D F
在十五楼做的cf..一会一断...比赛的时候做出了ABCF 就没有时间了 之后没看题解写出了D..E是个神奇的博弈(递推或者dp?)看了题解也没有理解..先写了CDF.. C 有n个袜子 每个袜子都有 ...
- Codeforces Round #604(Div. 2,
// https://codeforces.com/contest/1265/problem/D /* 感觉像是遍历的思维构造题 有思路就很好做的 可以把该题想象成过山车或者山峰...... */ # ...
- Codeforces Round #604 (Div. 2) (题解)
A. Beautiful String (暴力) 题目链接 题目大意: 给定一个字符串,只有 \(?a\ b\ c\ ?\) ,问是否存在一种将所有的 \(?\) 替换成 \(a\ b\ c\) ,使 ...
- 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 ...
- Codeforces Round #604 (Div. 2) D. Beautiful Sequence(构造)
链接: https://codeforces.com/contest/1265/problem/D 题意: An integer sequence is called beautiful if the ...
随机推荐
- 第01组 Beta版本演示
目录 1.1 本组成员 1.2 工作流程.组员分工.组员工作量比例 1.3 GitHub 项目链接 1.4 本组 Beta 冲刺站立会议博客链接汇总 1.5 燃尽图 1.6 原计划.达成情况及原因分析 ...
- 公式推导【ASRCF//CVPR2019】
Dai K, Wang D, Lu H, et al. Visual Tracking via Adaptive Spatially-Regularized Correlation Filters[C ...
- 【Spring】Spring框架配置详情
Spring框架的一个亮点就是能实现注入并且可以对实例化的Bean进行管理. 本文将对Spring框架的配置做一个详细的讲解. 一般情况下Spring是不单独使用的,而是和Hibernate配合使用, ...
- markdown 希腊字母
字母名称 大写 markdown原文 小写 markdown原文alpha A A α \alphabeta B B β \betagamma Γ \Gamma γ \gammadelta Δ \De ...
- 微信小程序开发语音识别文字教程
微信小程序开发语音识别文字教程 现在后台 添加插件 微信同声传译 然后app.json 加入插件 "plugins": { "WechatSI": { &quo ...
- jquery ajax怎么使用jsonp跨域访问
在项目中使用接口的比较多,在客户端跨域访问,jquery中只能使用jquery ajax的jsonp方法. 值得注意的是,jQuery.ajax()只支持get方式的跨域,post的方式是不支持的.& ...
- JS解决所有浏览器连续输入英文字母不换行问题,包括火狐(转)
问题描述: <p style="font-size:12px;line-height:30px;">测试数据测试数据</p> p标签内如果输入一长段英文字符 ...
- 休谟:《人性论》一书中提出的要重视"是"与"应该"的区别
"价值"最初是经济学的范畴,指的是经济价值.商品价值.价值作的为一个哲学概念,首先大概是由18 世纪的英国哲学家休谟(David H ume,1711-1776)提出的.他于173 ...
- 如何利用 VisualStudio2019 遠端工具進行偵錯
Hi 這次要來介紹 如何使用 Visual Studio 2019 遠端工具進行 Release 應用程式偵錯 首先我們先下載 2019 專用的遠端工具(這裡依照不同的 VisualStudio 版本 ...
- 2019 北森java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.北森等公司offer,岗位是Java后端开发,因为发展原因最终选择去了北森,入职一年时间了,也成为了面试官,之 ...