乐子人打哈欠,不过果然睡觉+甜食可以有效制止困意嘛…一早上都没打瞌睡,而且,奶枣真好吃啊(感叹),一天基本吃一包,我太离谱了,已经放得很远了,明天必须给它丢回寝室…真就当代鸦片
对于个别人,知道要和高一考试于是去高一群里阴阳怪气,被高一同学反驳了就开始喷人的,我在这里先扣一个L
一个好笑的事…好像我所有题的思路捋顺都是在洗手间…怎么和某银川队一样在厕所过题啊(滑稽)
时间安排
7.30-9.00
分析T1,大致有感觉了(但其实还有点慌)就开始写代码,写完之后测样例,样例2RE了又加了个细节,然后造了个数据跑了一下,能正常出ans,然后就跑了(时间感觉有点紧),想着回来搞个部分分程序拍一下
9.00-10.10
推了推T2,先写了个好写的线性筛,很明显第二档是杜教筛,第三档是min25,一直没推出来是什么卷什么,然后跑路了
10.10-12.00
再思索了一下T3,有点想法,直接开冲,冲完之后调了调,然后造数据测时间,发现过不了第4档,有点不甘心,但还是把 n n n 改成了第三档的大小,基本就到11.50了,交题躺平
题目分析
T1
冷静分析,首先,叶子结点的权值一定是 v v v
又因为从上到下的限制,所以本质就是对于每个根,往下在每个子树内顺着走,直到到一个和他状态相同的点
所以这个要怎么维护呢?首先先排一种状态
f [ i , o p , j ] f[i,op,j] f[i,op,j] 表示在i号点的子树内,颜色为op,选出价值为j是否可行
为啥不行呢,因为这样转移根本没法写吧(我在说什么废话)
具体来说,我们没法维护当前点选了什么颜色,也没法给上面反馈,与当前点颜色相反的子树点的贡献会变成什么样
但是我们感觉这个状态貌似还挺好的,而且感觉,只维护YES/NO 貌似有点浪费
所以我们把状态改成在 i i i 号点的及其子树内 i i i号点选中状态op,且它这一色点的权值为 j j j时,另一色点的值
然后转移就是两种,子节点同色或者异色
f [ i , o p , j + k ] = f [ i , o p , j ] + f [ w , o p , k ] f[i,op,j+k]=f[i,op,j]+f[w,op,k] f[i,op,j+k]=f[i,op,j]+f[w,op,k]
f [ i , o p , j + f [ w , o p x o r 1 , k ] ] = f [ i , o p , j ] + k f[i,op,j+f[w,op~xor~1,k]]=f[i,op,j]+k f[i,op,j+f[w,op xor 1,k]]=f[i,op,j]+k
然后注意,每个节点dp完之后,值都必须被填充至 v v v
并且,贪心的考虑,此时另一个值一定越小越优(可以填充,但是不能砍掉)
然后就做完了
T2
积性函数,所以记录一下构成 x x x 的最小的质数 p p p 在其中的 p k p^k pk 是多少
然后筛就行了)
思考了一下这玩意的性质,本质上其实是 ∏ ( 1 + p k ) \prod(1+p^k) ∏(1+pk)
感觉组合意义是从构成其的质数里任选k个得到的值求和
估计是根据这个意义去筛吧?
T3
sam之后,考虑能成为答案的位置只有叶节点,又因为一个节点会保留多个后缀,所以考虑线段树分治+线段树上区间取min
对于一个长度在 l e n f a + 1 , l e n len_{fa}+1,len lenfa+1,len 之内的节点来说,这一段内的位置进行线段树分治(因为值随位置减少),所以只需要插入这个点在序列中的位置,在查询到的时候减去查询点的下标就好
在线段树分治的时候,用可删除堆维护一下最优解
至于在 l e n f a , 1 len_fa,1 lenfa,1之内的节点,直接一个区间对 l e n f a + 1 len_fa+1 lenfa+1取min(以为长度更短的已经出现不止一次了)
写了3k…恼
update
T1
我还是觉得我的想法简单一些)
T2
什么辣鸡卡常题(骂骂咧咧),考场上有想到可能不是筛
不过u1s1 这卡常太离谱了吧啊喂!
T3
想法挺妙的,主要是要考虑到是一个前缀,而我恰好妹有考虑到,而且对于维护差分,我想的是线段树分治,但其实可以通过维护线段树上每个点,右边离的最近的端点