PKUSC2021 简要题解
作者:互联网
如果有同学需要我的代码的话可以私我要
当然由于本人很菜,代码不一定是对的,但是一定是过了自己造的对拍
D1T1 Sum Transformation
假设原矩阵第\(i\)行的和是\(a_i\),第\(j\)列的和是\(b_j\),整个矩阵的和是\(S\)
那么变换一次以后\((i,j)\)的位置就会变成\(a_i+b_j\)
考虑变换的第二次,简单推导一下,\((i,j)\)位置就会变成\(n(a_i+b_j)+2S\)
不难发现,\((i,j)\)位置的值一定可以用\(p(a_i+b_j)+q\)来表示,这个系数对于每一个位置是相同的
这个系数显然可以矩阵乘法递推解决
时间复杂度\(O(logT+n^2)\)
D1T2 逛街
如果没有修改,我们发现把每个\(i\)向最小的\(j>i\)满足\(a_j>a_i\)连边(找不到就往\(n+1\)连),这样会得到一棵树
在树上倍增就可以回答询问
注意到所有的相同的数一定是连成一段的
有修改就意味着一些数可能被覆盖掉,消失了
也就是树上的一些点被删掉了
先考虑sub2,所有修改是对于全局的
不难发现这样我们的删除只会删除叶子
考虑反证法,如果我们修改中删去了一个非叶子节点,那么由于是全局修改,它一定会往它的儿子扩展一步,它就出现在了新的位置,矛盾
于是询问我们就只需要在\(l\)处找到第一个树上还存在的叶子,倍增跳上去即可
找叶子可以用st表求区间最大值的位置
考虑sub3,所有修改是任意的
不难发现这样就可能会删除非叶子节点
但是可以看到的是,树的结构并不会改变,因为一个点它的父亲被删除了,它在树上的新父亲一定是它父亲的父亲,姑且称之为爷爷
证明考虑反证,假设它的父亲是\(x\),爷爷是\(y\),能找到的新父亲是\(z\),那么有\(a_y<a_x<a_z\)且\(x<z<y\),不难发现此时如果\(x\)被\(y\)覆盖掉了,由于\(z\)在\(x,y\)中间,所以\(z\)也一定被覆盖了,矛盾
所以这棵树是可以一直使用的
接下来我们还可以证明,尽管可能会删去非叶子节点,但是删去的非叶子节点一定出现在修改区间左端点处
因为只有左端点处的数才不能继续往左扩展,修改区间内部只会删去叶子,这一点的证明跟前面sub2里的证明是类似的
于是一个做法就呼之欲出了
只要我们能够维护每个位置的数并支持单点查询,就能够在树上删去非叶子节点的权值,并找到第一个非叶子节点并在树上完成倍增,查询链权值可以用bit\(O(logn)\)维护
考虑维护每个位置会对右侧的哪些点取max,不难发现这是一个连续区间,设右端点是\(r_i\),我们只需维护\(r_i\)
于是修改其实是让\(\forall i \in [L,R) , r_{i}=r_{i+1}\)
不难发现就是删去\(L\)这个位置的数,并在\(R\)这个位置补充一个原来的\(r_R\)
显然平衡树就是合适的数据结构
代码4.2k,还是挺好写的
D1T3 德州扑克
不会真的有“人”会做吧?
D2T1 一棵树
不删边sb题随便搞
考虑我们删除某条边造成的总贡献
考虑两侧子树中每条边的贡献
不难发现我们只需换根dp出以一个点为根,所有点的size和
就可以方便计算出两侧的贡献了
实现细节不少
D2T2 代金券
下午来补
标签:简要,PKUSC2021,题解,位置,叶子,修改,删去,树上,节点 来源: https://www.cnblogs.com/deaf/p/14784559.html