杂题

题意

对于两个长度分别为(n,m)的序列(A,B),初始时指针为((0,0))
若当前和(>0),两个指针((a,b))随意一个增加(1)
若当前和(=0),选择下一个位置为(1)的随意一个增加(1)
一个序列对合法当且仅当任意时刻和(ge 0)
给定两个有部分位置缺失的序列,给部分位置填({-1,1}),求有多少种方案使得序列对合法。
(n,mle 5000)

做法

结论:令(s_a,s_b)分别为两个序列以(-1)结尾的最小前缀和(若序列无(-1)则取整个序列的前缀和)。若(s_a,s_b)均不为整个序列的和,合法当且仅当(s_a+s_bge -1);否则合法当且仅当(s_a+s_bge 0)

proof
(s_a+s_bge 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_bge 0)
(s_a+s_ble -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} ightarrow f_{i-1,j+1,0},f_{i,j,1} ightarrow f_{i-1,j+1,1}).

  • (i-1)(-1)(f_{i,j,0} ightarrow f_{i-1,min(-1,j-1),0},f_{i,j,1} ightarrow f_{i-1,min(-1,j-1),[jle0]})

原文地址:https://www.cnblogs.com/Grice/p/14704560.html