zoukankan      html  css  js  c++  java
  • 【总结氵】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周

  • 相关阅读:
    Java Servlet-http协议
    ajax-典型应用-添加购物车
    ajax-典型应用-验证用户名
    jquery学习--选择器
    jquery---helloworld
    java转换json需导入的jar包说明
    vue对象更新
    解决方法:linux中无法使用root用户ssh远程登录
    related_name和related_query_name举例区别
    numpy 通用函数
  • 原文地址:https://www.cnblogs.com/namevastblog/p/14552219.html
Copyright © 2011-2022 走看看