其他分享
首页 > 其他分享> > PKUSC2021 简要题解

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