T1:HDRF
我们可以明白,其每次操作的方法是将上一次最后到的点回溯,然后寻找下一个,所以这样就可以一个线段树维护,区间最值,单点修改。
T2:Shortest Path Queries
我们注意到H很小,所以就可以用点奇淫巧技。就是拿一颗线段树维护一下l到r之间的mid到其他点的最短路,然后这个可以dj搞,这样在计算时,我们就可以直接枚举路径经过了这一列中的哪些点。也就是对于每一个询问,我们就在线段树上询问,怎么询问呢?就是枚举mid这个点,然后就可以在WXH∗log2的时间做出来(一个log是线段树的,另一个是dj的)。
T3:
首先考虑将两个树合并的做法。我们先分别找出这两颗树的直径的两个点,总共有4个,那么新的树的直径的点只可能是这四个点。
因为我们可以再连的点上跑dfs,这样必定搜到两边的直径。所以有了这个结论,我们可以这样:线段树记录l,r这个块的直径,合并时用倍增算出距离,然后回答。
T4:
先简化一下问题。我们知道,如果树都退化成链,我们就可以知道,能产生贡献的点必定满足在第一棵树上小于A,第二颗树上的小于B,那就是一个偏序。
然后,如果固定一个点,那么我们可以再线段树上维护这样的信息:dfs序上能产生贡献的必然是A的父节点们,所以我们只需要记一下能产生贡献的点,这样维护。那么就是查一个单点。
那么如果点没固定,我们有发现A的父亲的树与A只有一条链的区别(因为只加入了A),所以就可以用主席树。
这道题还可以标记永久化。
T5:Coprime Queries
在1e5的范围内,一个数最多有6个质因数。所以我们可以利用一下容斥。
那么我们先不考虑区间内求,就直接在整个数组中求。那么先把X分解,得到他的质因数,然后利用容斥,把区间中与他有一个公共因数的加上,减去与他两个因数的。。。。。。这样算出来就是不与他互质的。那么我们现在考虑怎么算这个容斥。我们可以对每个素数造一个线段树,然后查询。但是这样,我们发现要M,而且要T。所以我们这样:通过整体二分去掉一个log。这样就解决了。
T6:动态背包:
法一:可持久化。(写不来)
法二:首先,只删一件的背包我们可以用分治解决。
但是,我们现在要删多件,怎么办呢?我们注意到每件物品在存在的时间上是一整段,所以基于此,我们可以cdq对于时间分治,然后对于这个物品存在的区间,把这个物品加进去,然后分治是接着向下传就可以了。但是注意,我们这里只能传一个一维的容量数组。
T7:
明显,如果一个联通块只有奇数个点时是绝对不行的。在者,边越多,就越可能符合条件。
然后,这种问最大值最小的,我们想到了二分。就是对于一个ans,把小于他的边全部加进去,然后判断每个联通快是否为偶数个点。这样对每个点做,要T。所以自然想到整体二分。
就是对于二分到的区间,我们前一部分ans为mid之前,后一部分为mid之后。所以要用并查集乱搞,但是明显是可持久化并查集。
T8:
Dp[i]表示i这个点的天线全覆盖的代价。那么我们转移什么的也好搞。但是这样子的话,是nm的,于是自然想到优化一个log出来,那么我们想,连剖可以担此重任,我们将每个点的ans差分一下,然后就好转移了。
整体总结一下:
这些题你说考了什么新知识吧又没有,主要是思维题。