【总结氵】2021.02.27 省选模拟

2021.02.27 省选模拟

T1:序列
以下称询问排列为A排列,构造的排列为B排列,

考虑到我们无法确定每个A排列第一个数的位置,却可以确定末尾数的位置,一定在B排列的开头或结尾,因此我们从后往前取数

步骤1.首先考虑两个排列A1与A2,当其长度相同时怎么填

若两个排列的结尾数字相同,即\(.....a\)\(.....a\),则这个数可以放队头也可以放队尾

若两个排列的结尾数字不同,即\(....ax_1x_2x_3...x_nb\)\(....by_1y_2y_3...y_ma\),必然得一个放队头一个放队尾,保证合法

由于两个排列中a与b中间的数填的顺序是固定的,则如果确定了a,b的位置,a,b中间的数填的方式只有一种

\(ay_m...y_3y_2y_1...x_1x_2x_3...x_nb\),此时A1左边匹配到a,右边匹配到x1,A2类似

俩个以上排列也是类似的,如果有两个以上不同数显然不合法,否则一样处理

步骤2.再考虑如果我们有一个未填完的排列,而目前A排列匹配到的位置不完全相同,怎么填

由于匹配到位置不同,B必然会多出一截没有匹配但已经填了的数

设第\(i\)个数列队头匹配到了\(l_i\),队尾\(r_i\),那么根据B的第\(l_i+1\)\(r_i-1\)个数在数列\(i\)中的位置\(s1\)\(s2\),我们又可以继续将位置在\(s1到s2\)之间的数与B匹配,如果匹配到了B还没填的数,因为填的方案确定,可以直接填进去更新\(B\)

因为每个数列都可能更新\(B\),因此这个步骤要循环多次看能不能接着填,等所有\(A\)数列都无法再用步骤2更新\(B\)时,所有排列的剩余数字个数必然一致,就可以用步骤1,这样步骤12循环使用到把数列填满为止,不合法的情况匹配过程中判一下就好

以上填数列的过程中,每个步骤2的填数方案唯一,步骤1两种情况都是\(a\)放开头或末尾两种方案,即每次做步骤1方案数乘2

又另:只有步骤1出现两个不同数才有可能触发步骤2

至于字典数最小,在回溯时,填两个数时判一下哪个更小,填一个数时与答案数列的开头对比一下,看放开头还是结尾即可

T2:树

比赛时打了一个水法暴力,没想到思想跟正解类似,只是我是用的暴力实现,打挂细节\(75->0\)

两个结论:

1.若小于等于\(i\)的数小于\(i\)个,就无解,等于\(i\)个,则\(i+1\)一开始一定在路径上,大于则随便

2.边权一定为最大的那\(num\)个,\(num\)为路径上边条数

我比较蠢不会\(O(N)\)

先建出一个路径最短的初始图,从小到大把没加入路径的点置入路径,可以证明是最优的

为保证代价最小分两种情况,1.有儿子,将\(son\)的父亲改为\(i\)的父亲,\(i\)加入路径。2.没儿子,如果边都拿去贡献答案了,则拆一条出来加入路径,否则直接加入路径,答案加两条边,\(i\)的父亲因为\(i\)走了,多了一个\(fa_i\),可以更新\(fa_x\)\(fa_i\)大的点\(x\)的父亲,使多出来的边权尽可能大

选哪个\(x\)可与用堆维护

就这么道破题一堆细节调了我2.5周

posted @ 2021-03-17 22:01  namevast  阅读(44)  评论(0编辑  收藏  举报