A:宇宙飞船
发现最终合法的序列一定每一位要么放当前还未放过的最大值 要么放最小值
那么如果确定一个终点 对于终点前面的点
一定有一些是单调上升 另一些是单调下降的
考虑枚举这个点 而不动的元素就是最长上升和最长下降序列长度之和减1
所以直接跑最长上升子序列和最长下降子序列就可以了
枚举每个点 更新一遍答案就可以了
B:路径计数
首先如果不考虑重复 答案显然是(2^n-1)
因为长度一共为n 最多缩n-1次,每次缩都有两种方案
答案为(2^0+2^1+2^2+2^3+...+2^{n-1}+2^n)
然后考虑算重的部分
只有连续重复的字符会算重
先把一段连续字符原来的贡献去掉
再把这段字符真正的贡献加上
首先去掉原来的贡献
设这段极长的连续子串的左端点为l,右端点为r,长度为len
那么原先的贡献应该为(sumlimits_{i=l}^rsumlimits_{j=i}^r C(i-1+n-j,i-1))
这个发现在i固定的时候,组合数的答案是杨辉三角中连续的一列
所以可以优化成(O(n))
然后考虑加入新的贡献
假设该子串为baaaaab
给a编号为12345
容易发现到a2a3a4的方案数其实就是到a1a2a3a4的方案数加上到a2a3a4a5的方案数
它和其它方案数的差别在于 到达a1a2a3a4这个状态之后 到达a2a3a4的路径是唯一的
并没有左右二选一去缩
所以中间的子串是没有贡献的 或者说可以直接并到两边的子串 乘系数来得到它的贡献
那么就可以固定左端点 然后去求右端点在l,l+1,l+2,...,r-1的贡献
以及固定右端点 然后去求左端点在r,r-1,r-2,...,l+1的贡献
以左端点为例,先固定左端点左边的一个字符不能消掉,然后剩下的随便消
那么答案其实就是C(l-2+n-i,l-2)
右端点同理
然后这个东西直接O(n) 做就可以了
最后统计上原串整个的贡献
C:树和森林
咕咕咕
D:编码
咕咕咕