杂题
题意
对于两个长度分别为\(n,m\)的序列\(A,B\),初始时指针为\((0,0)\)。
若当前和\(>0\),两个指针\((a,b)\)随意一个增加\(1\)。
若当前和\(=0\),选择下一个位置为\(1\)的随意一个增加\(1\)。
一个序列对合法当且仅当任意时刻和\(\ge 0\)。
给定两个有部分位置缺失的序列,给部分位置填\(\{-1,1\}\),求有多少种方案使得序列对合法。
\(n,m\le 5000\)
做法
结论:令\(s_a,s_b\)分别为两个序列以\(-1\)结尾的最小前缀和(若序列无\(-1\)则取整个序列的前缀和)。若\(s_a,s_b\)均不为整个序列的和,合法当且仅当\(s_a+s_b\ge -1\);否则合法当且仅当\(s_a+s_b\ge 0\)。
proof
若\(s_a+s_b\ge 0\),则显然合法。
(1)若均不为整个序列的和,且满足\(s_a+s_b=-1\)。
首先这是充分的: 在到达\((a-1,b)\)或\((a,b-1)\)时,前缀和为\(0\),此时\(b+1/ a+1\)必定为\(1\)(否则不为最小前缀和),那么下一步移动到\((a-1,b+1)/(a+1,b-1)\),那么合法。
若\(s_a+s_b<-1\),则不合法:
由于\(s_{a-1}+s_{b-1}\le 0\),某时刻到达\((a-1,b-1)\)则必定不合法,在当前的指针所在位置\(\le (a,b)\),若大于\(0\),则在不超过\((a,b)\)的基础上移动,一般的,若某一时刻到达\((a-1,x)\),当前和\(>0\),那么移动第二维,否则由于\(a\)的位置为\(-1\),也必定移动第二维,故一定能到达\((a-1,b-1)\)。
(2)若存在一个使得为整个序列的和,且满足\(s_a+s_b\ge 0\)。
若\(s_a+s_b\le -1\),则不合法:
若两个均为整个序列,显然最后和会\(\le -1\);
假设\(a\)为整个序列,\(b\)不为整个序列,那么到达\((a,b-1)\)则不合法,能到达\((a,b-1)\)同上。
考虑其中一个序列,\(f_{i,j,0/1}\)为填完\([i,n]\),以\(-1\)结尾(若暂时还没有\(-1\)则最小前缀和为\(n-i+1\))的最小前缀和\(=j\),是否\(j\)等于总和,的方案数。
初始时\(f_{n+1,0,1}=1\)。
-
\(i-1\)填\(1\);\(f_{i,j,0}\rightarrow f_{i-1,j+1,0},f_{i,j,1}\rightarrow f_{i-1,j+1,1}\).
-
\(i-1\)填\(-1\):\(f_{i,j,0}\rightarrow f_{i-1,\min(-1,j-1),0},f_{i,j,1}\rightarrow f_{i-1,\min(-1,j-1),[j\le0]}\)