20200906 day1 模拟(一)
1
题意简述
\(A,B\)构成的一个长为\(T\)序列,给定\(M,N\)表示每次将恰好\(A\)个\(M\)与\(B\)个\(N\)变为\(Z\),且每次操作所改变的\(A,B\)之间不能有\(Z\),求将所有字母改变为\(Z\)的方案与否。
题解
首先特判\(M=0,N=0\)。
结论:当且仅当\(kM\)个\(A\)与\(kN\)个\(B\)时有合法方案,其余情况无合法方案。
证明
\(k=1\)时显然。(即一次性可改变所有字母)
\(k>1\)时,将整个序列划分为每段长\(K\),共\(s\)段的子序列,其中\(K=M+N,Ks=T\)
从\([1,K],[K+1,2K],...\)中,至少有一个子序列\(\alpha\)含\(\leq M\)个\(A\),至少有一个子序列\(\beta\)含\(\geq M\)个\(A\)
在长度\(K\)的“窗口”从第1位开始向右移动时,总会从序列\(\alpha\)移动到序列\(\beta\),且每次移动时区间内的\(A\)的数量\(D\)只可能\(+1,-1,0\)三种变化情况。(*)
所以在这之间的某一个区间一定满足\(D=M\),且该区间连续,可以把他删除。以此递归,可证。
(*)设区间\(A[BBAB]A\),窗口向右滑动时,多\(1\)个\(A\)少\(1\)个\(B\),\(A\)的数量变化是\(+1\);设区间\(A[ABAB]A\),窗口向右滑动时,多\(1\)个\(A\)少\(1\)个\(A\),\(A\)的数量变化是\(0\),同理区间\(A[BABB]B\);设区间\(A[ABAB]B\),窗口向右滑动时,多\(1\)个\(B\)少\(1\)个\(A\),\(A\)的数量变化是\(-1\)。
用栈维护从\(1\)到第\(J\)位\(A\)的个数\(sum[J]\),如果某段区间有恰好\(M\)个\(A\)(即\(sum[top]-sum[top-N-M]=N\)),则该区间合法。倒序输出。