Atcoder Grand Contest 022 E - Median Replace(dp)
首先考虑对于固定的 01 串怎样计算它是否可以通过将三个连续的 \(0\) 或 \(1\) 替换为其中位数得到。我们考虑单调栈,新建一个栈,栈底到栈顶分别是一段连续的 \(1\) 和一段连续的 \(0\),分别表示当前未合并完的字符,我们从左往右扫描,每遇到一个字符可分以下两种情况:
如果我们遇到一个 \(0\):
如果栈为空,那直接将这个 \(0\) 入栈就好了。
如果栈顶 \(0\) 的个数 \(\ge 2\),那么显然我们可以把三个连续的 \(0\) 合并成一个 \(0\),因为不论我们后来加入什么样的数字,这样一一合并下去最终只可能得到一个 \(0\),也就是说原来栈顶的两个 \(0\) 变成了一个 \(0\)。
如果栈顶没有 \(0\),否则直接将这个 \(0\) 入栈。
如果我们遇到一个 \(1\):
如果栈为空,那直接将这个 \(1\) 入栈就好了。
如果栈顶有 \(0\),并且栈不为空,那么栈最顶上的两个元素一定是一个 \(0\) 一个 \(1\),而显然如果第一个数是 \(0\),第二个数是 \(1\),那第三个数不论是多少,取中位数得到的结果一定还是第三个数,所以我们索性将最开头的 \(01\) 抵消,也就是说栈中 \(0\) 的个数减少了 \(1\),此时栈底到栈顶还是一段连续的 \(1\) 和一段连续的 \(0\)。
否则,栈中一定只剩一段连续的 \(1\)。如果这段 \(1\) 的个数 \(\ge 3\),仿照之前的推理过程它可以等效于 \(3\) 个 \(1\),否则我们就直接将 \(1\) 入栈。
显然最终栈不为空,并且该 01 串 \(s\) 满足条件的充要条件是最后 \(1\) 的个数大于 \(0\) 的个数,因为如果在合并过程中不存在栈中剩余 \(\ge 3\) 个 \(1\),并且又进来了一个 \(1\) 的情况,那么每次操作栈内数的个数要么 \(+1\) 要么 \(-1\),而 \(n\) 为奇数,故最后栈中剩余数的个数是奇数。如果只剩一个 \(1\) 那就直接满足条件了,如果剩 \(2\) 个 \(1\) 一个 \(0\) 或者 \(3\) 个 \(1\) 把这三个数合并一下即可,如果剩 \(3\) 个 \(1\) 两个 \(0\) 根据抽屉原理一定存在连续的三个数中恰好有 \(2\) 个 \(1\),把这三个数合并得到一个 \(1\),再把剩下三个数合并即可。如果在合并过程中存在栈中剩余 \(\ge 3\) 个 \(1\),并且又进来了一个 \(1\) 的情况,那么最终这三个 \(1\) 一定不会被消掉,也就是说最终 \(1\) 的个数为 \(3\),严格大于 \(0\) 的个数的最大值 \(2\),也符合题意。
接下来考虑原题。不难发现任何时刻单调栈中 \(1\) 的个数 \(\le 3\),\(0\) 的个数 \(\le 2\),也就是说本质不同的单调栈的个数 \(\le 12\)。我们考虑将单调栈放入 DP 状态中,即设 \(dp_{i,x,y}\) 表示考虑到第 \(i\) 个字符,单调栈中还剩 \(x\) 个 \(0\) 和 \(y\) 个 \(1\) 的方案数。分该位填 \(0\) 和该位填 \(1\) 转移即可。复杂度线性。
const int MAXN=3e5;
const int MOD=1e9+7;
int n,dp[MAXN+5][3][4];char s[MAXN+5];
void add(int &x,int v){((x+=v)>=MOD)&&(x-=MOD);}
int main(){
scanf("%s",s+1);n=strlen(s+1);dp[0][0][0]=1;
for(int i=0;i<n;i++) for(int c0=0;c0<3;c0++) for(int c1=0;c1<4;c1++){
if(s[i+1]!='1'){//digit 0
if(c0==2) add(dp[i+1][1][c1],dp[i][c0][c1]);
else add(dp[i+1][c0+1][c1],dp[i][c0][c1]);
} if(s[i+1]!='0'){//digit 1
if(c0) add(dp[i+1][c0-1][c1],dp[i][c0][c1]);
else add(dp[i+1][c0][min(c1+1,3)],dp[i][c0][c1]);
}
} int ans=0;
for(int c1=1;c1<=3;c1++) for(int c0=0;c0<c1;c0++)
add(ans,dp[n][c0][c1]);
printf("%d\n",ans);
return 0;
}
Atcoder Grand Contest 022 E - Median Replace(dp)的更多相关文章
- Atcoder Grand Contest 002 F - Leftmost Ball(dp)
Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...
- AtCoder Grand Contest 032 A - Limited Insertion( 思维)
Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement Snuke has an empty ...
- Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)
Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...
- Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)
Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...
- Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)
洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...
- Atcoder Grand Contest 013 E - Placing Squares(组合意义转化+矩阵快速幂/代数推导,思维题)
Atcoder 题面传送门 & 洛谷题面传送门 这是一道难度 Cu 的 AGC E,碰到这种思维题我只能说:not for me,thx 然鹅似乎 ycx 把题看错了? 首先这个平方与乘法比较 ...
- Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)
Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...
- 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)
题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...
- AtCoder Grand Contest 022
A - Diverse Word Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Gotou ...
随机推荐
- 【Spring】IoC容器 - 依赖注入
前言 上一篇文章已经学习了[依赖查找]相关的知识,这里详细的介绍一下[依赖注入]. 依赖注入 - 分类 因为自己是基于小马哥的脉络来学习,并且很认可小马哥梳理的分类方式,下面按照小马哥思想为[依赖注入 ...
- 如何使用远程工具连接Linux服务器
大家好,今天我想和大家分享一下Linux如何连接远程控制工具我们都知道,Linux是著名的开源服务器操作系统,而在运维工程师的实际工作当中,我们不大可能时时刻刻都在服务器本地操作.因此这时,我们要用远 ...
- 易维巡APP技术支持
亲爱的用户 如果您在使用我们的产品时遇到任何问题,请随时与我们联系,我们将全力全意为您解决! 请发邮件与我们联系,我们将24小时为您服务! 电话:18251927768 邮箱地址:xshm999@16 ...
- 基于自定义Validator来验证枚举类型
基于自定义Validator来验证枚举类型 一.背景 二.技术要点 三.实现一个自定义枚举校验. 1.需求. 2.实现步骤 1.自定义一个 Sex 枚举. 2.自定义一个 Enum 注解 3.编写具体 ...
- RAW RGB格式
RAW RGB格式 10bit Raw RGB, 就是说用10bit去表示一个R, G, 或者B, 通常的都是用8bit的. 所以你后面处理时要把它转换为8bit的, 比较简单的方法就是将低两位去掉, ...
- Oracle 11g 常用sql记录
--表备份 create table xxx_bak as select * from xxx; --表数据清除 truncate table xxx --锁表问题处理sql开始 select ses ...
- Go语言核心36讲(Go语言进阶技术十一)--学习笔记
17 | go语句及其执行规则(下) 知识扩展 问题 1:怎样才能让主 goroutine 等待其他 goroutine? 我刚才说过,一旦主 goroutine 中的代码执行完毕,当前的 Go 程序 ...
- clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
修改文件 /etc/sysconfig/nfs将#MOUNTD_PORT=892开启防火墙端口:firewalld-cmd --add-port=892/tcp
- oracle修改CHARACTERSET
[oracle@vm10-84-32-2 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Jun 11 1 ...
- Redis监控调研
1 调研目的 主要的目的是想调研各大云平台有关Redis监控功能的实现,但是最后我发现各大云平台提供的监控功能都比较基础,比如我想看诸如访问频率较高的HotKey.占用内存较大的Bigkey等指标,它 ...