• 2018 Multi-University Training Contest 7


    2018 Multi-University Training Contest 7


    A.Age of Moyu

    • 题意:给定n个点,m条边的无向图,每条边都有一个color,现在你需要从1走到n,在走的过程中,如果你经过的前一条边的color和后一条边不同,那么代价+1,求从起点走到终点的最小代价。一开始的代价为1。
    • dfs加bfs的做法。
    • 我们每次都是在bfs得到的队列的基础上进行dfs。我们首先dfs从1开始,搜到所有代价为1的点,也就是说,这些点存在一条到1的路径,这条路径上的颜色始终不变。也可以理解为进行了最短路,搜到了所有代价为1的点。然后第二步,在所有代价为1的点的基础上,进行dfs,搜索所有代价为2的点,直到搜索到n为止。

    I.Tree

    • 题意:给定了一棵树,树上的每个点都有权值,每个点的权值的定义为:从这个点往父亲的方向条k步。现在有两种操作,第一种,修改某个点的权值,第二种,询问,从这个点开始,往上跳几次可以跳出这一颗树。
      (n≤100000)(m≤100000)
    • 树分块或lct。
    • 写下树分块的做法,因为lct不会。
    • 如果现在的树是一条链的话,我们可以直接将这条链分块,然后块内的每个点记录3个属性。
    • 1、这个点跳time次可以跳出这个块。
    • 2、这个点跳time次跳出这个块后,跳到了哪一个块。
    • 3、这个点跳time次后,跳到了下个块的哪个位置。
    • 这一步份预处理采用倍增,O(n*logn)的时间处理完。
    • 然后对与修改,我们暴力修改块内的所有点的3个属性,sqrt(n)*log(n)。
    • 对于查询的点,由于3个属性已知,我们直接暴力条sqrt次即可。
    • 总复杂度O(nlogn+msqrt(n)*log(n))。
    • 然而,这个题是一颗树,那么我们考虑树上分块。在分块的时候,我们要保证的一个性质就是,在块内,只有可能是后面的点往前跳,前面的点不能往后跳。否则,在修改一个块的时候,我们不知道修改的顺序,是先修改前面的,还是后面的。所以依照这个性质,我们只需将dfs序分块,然后树上倍增预处理即可。

    K.Swordsman

    • 题意:有一个人去打怪,这个人有k项属性,1≤k≤5。每个怪也有k项属性,如果这个人的k项没有一项比怪低的,那么他能把怪打死,然后他的k项属性都会获得提高。现在有100000只怪,求最多打死多少怪,然后最后的属性值是多少。
    • 我们对所有怪的每项属性分开排序,然后设立5根指针,将5根指针移动到目前的人的能力值。在移动的过程中,可以发现,移动过的地方代表某个怪的某个能力小于等于人,那么在这个怪的那个属性上打标记,代表这个怪的这个能力已经低于人了。然后,我们在移动的过程中,如果发现,某个怪的所有能力全部被标记了,那么代表这个怪就可以被杀死,人的能里提升,指针可继续往后移动。若指针无法移动,则代表人已经无法杀死怪了,退出循环即可。复杂度为O(n5logn)。
  • 相关阅读:
    解决Android SDK Manager无法更新下载
    使用Anaconda3配置多版本Python虚拟开发环境
    Python·Jupyter Notebook各种使用方法
    学习 python 编写规范 pep8 的问题笔记
    ajax工作原理及其优缺点
    json和jsonp
    cookie、session、localStorage、sessionStorage区别
    浅谈前端性能优化(PC版)
    浅谈前端性能优化(移动端)
    前端优化 -- Combo Handler
  • 原文地址:https://www.cnblogs.com/nowheretrix/p/9501518.html
Copyright © 2020-2023  润新知