• 2022.8.6 模拟赛


    T1 escape

      字典序最小,所以考虑贪心。

      从小到大枚举每一个位置,再枚举从小到大每一个字母,看这个字母后面有没有,如果有判断它移到这个位置的步数(用树状数组区间加实现),如果可以那么 k − = s t e p k -= step k=step

      复杂度大概就是 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的。

    T2 ride

      注意到有很多部分分,所以可以考虑每一种图怎么骗分。但是由于这个正解也比较简单,所以就直接说正解了,部分分今天写完有空再写吧。

      对于点 x x x f x , i f_{x, i} fx,i 表示以这个点为根,到它的第 i i i 颗子树中的海拔下降的路径的条数,那么这个点的贡献就是(子树个数为 k k k):

    2 ( ∑ i = 1 k ∑ j = 1 k f x , i f x , j ) = ( ∑ i = 1 k f x , i ) 2 − ∑ i = 1 k f x , i 2 2(\sum_{i = 1}^k\sum_{j = 1}^k f_{x, i}f_{x, j}) = \left( \sum_{i = 1}^k f_{x, i} \right)^2 - \sum_{i = 1}^k f_{x, i}^2 2(i=1kj=1kfx,ifx,j)=(i=1kfx,i)2i=1kfx,i2

      然后就树形 d p dp dp,转移就是:

    f x = ∑ y ∈ S u n ( x ) ∧ y < x ( f y + 1 ) f_{x} = \sum_{y \in Sun(x) \land y < x}(f_y + 1) fx=ySun(x)y<x(fy+1)

      这里面有一个条件 y < x y < x y<x 所以我们考虑按照海马顺次递增枚举计算贡献,然后就做完了。

    T3 road

      我们考虑 x → y x \to y xy 存不存在距离为 d d d 的路径(不一定是简单路径)。

      假设我们找到了一条 x → y x \to y xy 的最短路,长度为 l e n len len,那么我们考虑在这条最短路的某两个点上反复横跳来延长路径长度。

      这样一来,我们发现延长的路径长度一定是偶数,所以如果 l e n len len d d d 奇偶性相同,那么就一定存在一条路径从 x → y x \to y xy 长度为 d d d

      所以我们维护一个 数组 d i s x , y , k dis_{x, y, k} disx,y,k ,其中 k k k 等于 0 0 0 或者 1 1 1 k = 0 k = 0 k=0 时表示是否存在路径长度为偶数的最短路的长度, k = 1 k = 1 k=1 表示是否存在路径长度为奇数的最短路的长度。那么存在长度为 d d d 的路径当且仅当:

    d i s x , y , d m o d    2 ≤ d dis_{x, y, d \mod 2} \leq d disx,y,dmod2d

      时间复杂度 O ( n 2 ) O(n^2) O(n2)

    T4 tree

    n ≤ 10 n \leq 10 n10

      首先时前 20 p t s 20pts 20pts,就暴力搜索然后 O ( log ⁡ n ) O(\log n) O(logn) 求距离,令 f n f_n fn 表示匹配方案数,那么时间复杂度时 O ( n f n log ⁡ n ) O(nf_n\log n) O(nfnlogn)

    菊花图

      然后 40 p t s 40pts 40pts 做菊花图,我们发现对于菊花图来说,所有方案的 ∑ i = 1 n 2 d i \sum\limits_{i = 1}^{\frac n2}d_i i=12ndi 都是相同的。因为都是有一个点和最中间的点配对,然后其它点两两配对所以是:

    ∑ i = 1 n 2 d i = 1 + n − 2 2 × 2 = n − 1 \sum_{i = 1}^{\frac n2} d_i = 1 + \frac{n - 2}{2} \times 2 = n - 1 i=12ndi=1+2n2×2=n1

      然后答案就应该是 ( n − 1 ) f n (n - 1)f_n (n1)fn,所以我们考虑怎么求的 f n f_n fn

      一种比较显然的方法就是递推,我们显然可以从 f n − 2 f_{n - 2} fn2 转移到 f n f_n fn

    f n = ( n − 1 ) f n − 2 f_n = (n - 1)f_{n - 2} fn=(n1)fn2

      然后就能 O ( n ) O(n) O(n) 算出答案了。

  • 相关阅读:
    jmh测试实践(针对不同准备数据测试)
    国金证券DevOps建设项目分享——嘉为蓝鲸
    Kotlin编程实战——类与对象(05)
    Linux ARM平台开发系列讲解(platform平台子系统) 2.10.1 platform平台子系统介绍
    6-羧基四甲基罗丹明,CAS号: 91809-67-5
    四、卷积神经网络(Convolution Neural Networks)
    unity操作_Camera c#
    Linux中scp命令复制文件
    Zabbix 5.0 使用自带Redis模版监控
    install flash_atten
  • 原文地址:https://blog.csdn.net/ID246783/article/details/126194101