B
对于所有 \(x\in[0,n],y\in[0,m]\),求执行 \(x\gets x+y,y\gets x+y\) 若干次后满足 \(x=k\) 的双元组个数。
这个题充分体现我的唐氏。
具体地枚举 \(x,y\) 分别被算了多少次,系数是斐波那契数列,所以项数很少。
然后转化为求 \(k_1x+k_2y=k\) 的方案数,这个我非常唐不会求。
只需要把通项拿出来 \(x=x_0+ty,y=y_0-tx\),算 \(t\) 取值范围即可。
注意特判 \(k=0\) 非常难绷。
C
AT_joisc2014_e 水筒
这个题显然是要求最小生成树然后查询两两点之间最大边的大小。如果两两点之间都建边求那边太多。
考虑“BFS优化建图”,就是有用的边不多,考虑做 BFS。
因为当前点都是同步拓展的,所以当两个连通块碰到的时候这两个连通块才需要建边。
也就是网格上一个点到其最短和次短的点才需要连起来,其他的点到这个位置都是要更远的。
在连通块里碰不到的,也就是其之间一定存在一个连通块同时碰到他们两个,只保留这两条边即可。
我们用不着的边,其连接的两端一定可以由长度更短的边连起来,也符合了 MST 的性质。
最后并查集合并用启发式,每个集合里面维护当前还需计算的询问,合并集合就把可以算的询问算了。