NOIP2018停课训练1

day1

40+35+20

d1t1

给出一个n*m的网格图,有n个给定点在网格图的交点上,要求从(0,0)出发到(n,m),求离给定点的最小距离的最大值。

n<=2000

题解:

最小生成树。

两两给定点连边,并且向上下左右分别连边。

不能到达的情况为:

1、上下联通

2、左右联通

3、上左联通

4、下右联通

d1t2

给出一棵树和一条非树边,求图的最短路径的最大值。

n<=1e6

题解:

重边情况,选较小的一条变成树,求直径。

自环情况显然不会走自环,求直径。

其他情况非树边会构成一个环,那么就是一个环套树。

把环找一个点断开并倍长序列,对于环上点挂着的树求最远点,那么答案可能为:

1、某棵树的直径

2、某两棵子树的最远点形成的路径。

用数据结构可以做到O(nlogn),单调队列可以优化一个log

d1t3

给出一棵树,每条边有一个通过的时间,要求从1进入树并且至少经过所有节点一次后从1出来。

当你在一个节点时,可以进行两种不消耗任何时间的操作:

1、放置一个1号传送门,并撤销上一个1号传送门

2、放置一个2号传送门,并撤销上一个2号传送门

3、如果放置了1号传送门并且有2号传送门,传送到2号传送门所在节点

4、如果放置了2号传送门并且有1号传送门,传送到1号传送门所在节点

求完成遍历的最小时间。

n<=1e6

题解:

传送门肯定是后代往祖先上跳更优,并且对于一棵子树,如果根节点上有传送门,我们可以最后遍历子树最远点并跳回来。

考虑dp,设f[i][0]表示在i点不使用传送门,f[i][1]表示使用

对于所有son[i],我们可以在i点使用传送门,而选择从son[i]的最远点处跳回,或者在son[i]使用,i点不使用。

day2

90+0+40

d2t1

给出0~n个位置,初始在0,有k种跳跃方式形如(ai,wi),即使用wi的时间跳ai步。

如果你上次使用了第i种跳跃方式,下一次将使用第j种(i<>j),那么需要额外的v时间来转换(第一次选择跳跃方式不需要时间)。

有些限制形如(xi,yi),表示不能使用第yi种方式经过位置xi。

求0~n的最小时间。

n<=500,k<=100

题解:

考虑dp,设f[i][j],表示跳到第i个位置,最后使用的是第j种跳跃方式的最小时间。

每次枚举上一个使用的是哪种跳跃方式转移就好了。

d2t2

给出一棵树,每个点上有点权,有q个指令:

1、询问,给出ki个点,询问这些点中任意两点路径上所有的点的和

2、修改,改变一个节点的权值

n,q<=1e5,Σk<=1e6

题解:

对于每个询问,如何做到不重不漏?

我们可以考虑把询问点按dfs序排序,这样前i个点的lca的dfs序会越来越小。

枚举询问点,每次加入当前询问点到之前所有询问点的lca上的值

那么变化一下,就变成了每个点到根的和-相邻两点的lca到根的距离+所有点lca的父亲到根的距离。

询问可以用树链剖分+线段树解决,修改也就变得简单了。

d2t3

给出一个n个点m条边的带权图,每次询问两点之间不经过重复点的路径的最大值。

还有修改操作,修改一个点的点权。

n,m,q<=1e5

题解:

构出圆方树,每个点双中的点向方点连边,每个方点的权值定为点双中的最小点。

但是这样的话,如果是菊花图。那么修改根节点就会修改所有点双。

那么我们改变一下点双的意义,不维护环头,那么修改变成O(2)的啦。

每个方点弄一个可以维护最小值并且支持插入删除的东西,multiset很ok。

猜你喜欢

转载自www.cnblogs.com/lmlysklt/p/9823368.html