A. Big binary tree [zmy]
每次修改一个点,修改其父亲所有节点的 mx[x] 值,即向下走的最大距离。查询时,我们考虑 dp 的过程,先计算两个子树的结果,然后再向上推,计算向上路径的最大长度。思路比较简单。但是代码技巧很多。
- 对于一个没有被更新过的节点
v
,假设其向左扩展的最大深度为
x ,向右扩展的最大深度为 y 。那么如果x!=y ,则最长路径一定是 v−>n ,否则一定是 v 到向右扩展的最大位置。 - 只对询问的点存到 map 里,其他都用暴力求,实际上更快一些。
- 多用 map 的 count 函数
- 由于是二叉树,不用一般的树 dp 那样维护一个最大和次大,只用维护最大即可。找一条不过它的路径,用异或
1 的方式就可以了
B. Ch’s gift [zmy]
首先将所有操作变成询问。对于点权,变成一个增加点权的操作。对于查询 [L,R] ,变成两个询问 [1,L−1] 和 [1,R] 。之后按照权值大小排序。求出树的dfs序,用树状数组维护点权。增加一个点的点权时,在 l[x] 位置增加 vi ,在 r[x] 位置增加 −vi 。对于 x−>y 这条链上的答案,通过 sum(l[lca(x,y)],l[x])+sum(l[lca(x,y)],l[y])−sum(l[lca(x,y)]) 得到。
C. CSGO [wbr]
首先将所有线段的端点和所有的敌人按照询问点的极角排好序。因为线段不会相交所以用set维护线段离原点的先后顺序就可以了。注意精度。时间复杂度 O(TQNlgN) 。
D. Dying Light[wbr]
可以看出反射的次数非常少,因此可以暴力模拟。模拟的过程中要注意利用叉积判断在哪条边上。使用On_segment函数可能会导致精度不够。
E. FFF at Valentine [zmy]
暴力求解每个点对是否能从一方到另一方。
F. Senior Pan [zmy]
将 K 点都加入到优先队列里跑 dijkstra ,图中每个点只能被访问两次,每当一个关键点到另一个关键点时更新答案。
G. Missile Interception [wbr]
二分答案。计算出答案时间时每个导弹的位置,然后就是一个裸圆交问题。
H. Numbers [zmy]
用 map 维护已经构造出来的和。如果新的数不在这个 map 中,那么一定是
I. Senior PanⅡ[zmy]
如果
k
不为质数,那么答案一定是
否则,假设
k
是第
几个类似的题:
J. Two strings [zmy]
dp。
fi,j,k
表示匹配到
si,tj
时的情况。如果
k
为