码迷,mamicode.com
首页 > 其他好文 > 详细

2018 Multi-University Training Contest 7

时间:2018-08-19 17:08:57      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:tree   无法   bfs   复杂   设立   否则   contest   ini   提升   

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)。

2018 Multi-University Training Contest 7

标签:tree   无法   bfs   复杂   设立   否则   contest   ini   提升   

原文地址:https://www.cnblogs.com/nowheretrix/p/9501518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!