联考day7

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

那么原先的贡献应该为\(\sum\limits_{i=l}^r\sum\limits_{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:编码

咕咕咕

上一篇:撤销rebase与git原理


下一篇:Git 实用操作:撤销 Commit 提交