校内最后一场
M(构造、位运算性质)
大致题意:给定n和m,再给定n个数,,其中每个数都>=0且<=且都不相同,由给定个数,对任意的i都满足:i⊕>i⊕(j为不等于i的任何数),现给定n、m、y,求有多少种x数列满足条件
题解:观察i,可将个i分为前半部分与后半部分,且前半部分与后半部分对应位置的i仅最高位不同,前半部分最高位恒为1,后半部分最高位恒为0,易知:
- 若x中同时含有最高位为1和最高位为0的数,前半部分总是选择最高位为0的数,后半部分总是选择最高位为1的数,这样其异或后最高位才为1,而这是满足最大的前提条件
- 若x中只含有最高位为1或只含有最高位为0的数,以只含有最高位为1的情况举例,前半部分其异或后最高位都只能为0,而后半部分异或后最高位总是为1,又由于前半部分和后半部分对应位置的i仅最高位不同,故前半部分的y和后半部分对应位置的y总是相同,可递归到前半部分或后半部分解决
而题目给定了y,故首先判断前半部分和后半部分对应y值是否全都不同,若全都不同,则满足条件1,两部分再分别递归解决;若有相同的,则可能满足条件2,再进一步判断是否前半部分和后半部分对应y值都相同,若都相同,则递归到前半部分或后半部分解决问题,此时最高位取1或0都可以,故序列总数为前半部分的序列总数*2,若存在不同,则与上述条件相悖,故答案为0
1 |
|
G(扫描线)
大致题意:给定n个矩形的坐标,求是否有矩形相交(包含不属于相交)
题解:算是扫描线的模板题吧,思路是先对横坐标离散化后用线段树维护横坐标区间和,扫描到下边时,查询下边横坐标范围内区间和是否大于0,若大于0,则存在至少一个矩阵其左下端点或右下端在该范围内,构成相交条件,更新时,若遇到下边,将左右端点的对应位置值+1,上边则-1
1 |
|
主要是对题设条件如何转化成线段树操作卡住了,扫描线算法应该以边为单位思考,两个矩形相交如何转化成两个下边的关系,两个下边的关系又如何转化成查询、更新操作
F(概率密度+树形dp)
被fft折磨了半天,再看这道题简直眉清目秀bushi
大致题意:给定包含n个节点(n<=300)的一颗树和其对应值(范围为1e9),每个节点的值为0~内的任意一个数,现求该树能形成小顶堆的概率(即节点上的值严格小于其所有的子节点的值)
在场上的时候想了个离散化后直接树形dp,但是没考虑好,离散化后其实根本没法处理,是个很离谱的错解
正解思路:引入概率密度函数f(x),即节点上的值为x的概率,此题中u节点若为叶子节点,显然f(x)=1/a[u],0<=x<=a[u]时成立,而F(x)函数为f(x)的积函数,表示的是节点上的值小于等于x的概率(注意:该条件对任意的节点均成立)。
思考,除了叶子节点外,其他节点的f(x)如何考虑。显然,要根据树形dp转移,我们需要将上述条件加强。f(x)—节点上的值为x且子树满足小顶堆的概率,F(x)—节点上的值小于等于x且子树满足小顶堆的概率。
显然,对于非叶子节点u和其子节点v(有多个子节点,均是乘操作,为书写方便只取一个子节点),f(u,x)=1/a[u]*G(v,x),G(v,x)表示v节点的值大于x的概率。
如何求G(v,x),显然要从F(v,x)入手,是1-F(v,x)?不,1实际上是F(v,a[v]),但很显然v节点的值的上界会收到其子节点的影响(必须比子节点小),故取其所有子节点的a值最小值,与a[v]相比取最小值即为其新的上界。故G(v,x)=F(v,mn[v])-F[v,x]。
那么到此,此题基本结束,先求出本节点的f(x),再积分得到F(x),再通过上述计算得到G(x),而最后的答案便是F(root,mn[root]),即G(root,x)的常数项。
1 |
|
复杂度分析:n个节点*n次mul操作,而mul操作是,故最后是