杂题

1.Bitwise Xor

  若干个数两两异或值取得最小必然是排完序之后相邻位置的异或值。

  所以给序列排个序简单dp就行了。

  发现这个dp可以放在trie树上,于是放在trie树上跑复杂度就正确了。

 

2.平方串

  考虑枚举长度len,每隔len设置关键点,那么每个平方串会恰好经过两个关键点。

  求出来lcp和lcs就可以求出来答案。

 

3.不定方程解的乘积之和。

  考虑解的方案数,发现就是简单的挡板法。

  考虑乘积的组合意义,实际上就是给每两个挡板之间又设置了一个挡板的方案数,所以增加$n$个元即可。

  类似的方法可以扩展到组合数的乘积。

 

4.中美合拍

  考虑L=0的情况。

  将所有数按照最高位分类,然后讨论最高位为1的所有数是否全部选择了1,如果是向下递归,否则可以发现,只要最高位是正确的,那么其他所有位不管怎么选,都可以通过调整最高位为0的那个数来使得答案正确。

  那么现在有了L的限制,我们考虑容斥。简单的想法是枚举至少多少个不满足条件,那么这是个带容斥系数的dp,发现可以用矩阵来优化。

 

5.CTSC2017 游戏

  首先可以发现一个位置获胜的概率之和两侧最近的已经确定的位置有关,那么将这个序列分成了若干个区间,考虑对每一个区间分别考虑。

  用条件概率可以得到每个位置的获胜概率法的比较简单的形式,考虑对于分子和分母分别维护。

  对于分母,发现可以用线段树维护dp的转移矩阵来维护。

  对于分子,做法类似,在每个区间维护左右端点胜负情况时的区间胜率和即可。

 

6.求N个节点的二叉树的叶子节点数的期望。

  考虑一个叶子节点可以表示成一个pair,即删掉这个节点后的二叉树和这个节点的父亲是谁。

  那么只要计数这个pair即可。

  第一维的方案数显然是个卡特兰数,第二维考虑一共n-1个节点,有n-2个儿子,所以还有空位置n个。

  所以得到总方案数除掉二叉树个数即可。

 

7.short LIS

  考虑一个LIS长度不超过2的排列,那么这样的排列和他的前缀max序列是一一对应的。

  那么实际上就是对于这样的前缀max序列计数。

  考虑一些限制之后就可以发现实际上就是限定起点和终点,并且不经过某条线的方案数,用翻折法可以得到方案数。

 

8.多次翻折法

  似乎是个挺神仙的东西。。。。

  给定起点和终点,和上下界两条直线,要求路径中不能通过上下界,求方案数。

  可以先考虑求出来不合法的方案数。

  首先枚举一个“上下上下上......”的序列,给每个位置安排一个容斥系数为+1,-1交替。

  然后换个序列,强制先经过下边界,容斥系数同理。

  那么可以发现,每条不合法的路径都恰好被计算了1次。

  考虑只有一个边界时的方案数,那么将终点按照这条线翻折,每一条跨过线的路径都可以对应一条走到对应点的路径。

  那么两个边界时,首先找出来终点关于一条直线的对应点,记一次数,那么这是第一个位置。

  然后找到这个对应点关于另一条直线的对应点,再计数。依次类推。

 

9.CF603E

  结论是,有解当且仅当所有连通块的大小都为偶数。

  考虑随着边数的增加,答案一定不会变劣。

  所以可以搞一个类似整体二分的分治。

  每次求出mid的答案,将若干条边加入并查集向下分治即可。

 

10.Game with Marbles

  考虑期望的线性性,也就是考虑每个球被选中的概率。

  对于绿球拿出的期望个数显然是绿球个数/篮球个数。

  对于红球分开考虑每一个,他不被拿出的概率就是在每个蓝球的后面拿。

  求个和就行了。

 

11.给定一棵树,求$i$条边的最大权匹配。

  考虑链上的做法,将一个区间的数组看成一个多项式,那么合并区间可以看做两个多项式做$max-add$卷积。

  可以发现这个东西是个凸函数,所以给两个多项式差分之后考虑下一步选最大的即可在线性复杂度内完成卷积。

  然后链上的做法整个分治就可以了。

  考虑将这个东西扩展到树上,那么可以想到重链剖分,每次将重儿子和所有轻儿子的dp数组合并起来即可。

 

12. mythological I

  假如前面n个数的和已经确定,那么后面的m-n个数的方案数就是一个组合数。

  将这个组合数展开可以得到一个多项式,那么给这个多项式的每一项系数分别求解即可。

  考虑如何计算每一项,那么要求的就是前面n个数的和的k次方的总贡献,然后发现这个东西可以通过倍增来求。

  

13.GYM100958 I

  假如当前已经确定了T是什么,考虑如何计算合法的S个数。

  考虑枚举T在S中第一次出现的位置,然后可以简单统计答案。

  然后考虑如何计算第一次出现的方案,令$f[i]$表示在i第一次出现的方案数,那么只要用总方案减去不合法的方案(前面出现过)即可。

  然后这个东西就可以dp了,发现两个串T的dp数组不同,当且仅当他们的border集合不同。

  发现合法的border集合并不多,所以全部搜索出来进行dp即可。

  搜索需要一些细节。

 

posted @ 2020-04-07 21:56  tdcp  阅读(175)  评论(0编辑  收藏  举报