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。