最小公倍数
考虑暴力做法,对于每一个询问,暴力加入满足询问的边,然后维护联通性和maxa,b,如果满足条件则YES。
两个条件的限制似乎很难用别的数据结构优化掉,那么考虑分块,先以a为第一关键字,b为第二关键字排序,每
m0.5
分成一块。然后把每一个询问归类到相应的块中,使得这个询问的a大于等于块的a最小值小于等于最大值。
依次扫每个块,把每个块的询问取出来。设当前的块号是
i
,那么我们把1到i-1的块里面的所有的边按b排序,再把这个块内的询问按b排序。然后扫1到i-1的符合当前询问的边,加入并查集。对于i块内的边,只能暴力扫然后加入并查集了,注意处理完这个询问后,要撤销掉在该块内加入的边。所以此题的并查集不能路径压缩,要用启发式合并或按秩合并,两者都是
网络
考虑暴力做法,先树链剖分,线段树的每个点维护一个可重set表示不经过这个区间的权值集合,因为整棵树的DFS序是连续的,加入一条链时,会被影响到的区间有log个,相当于在一个木棍上砍log刀,剩下的部分还是log的,然后线段树暴力打标记即可,开O2可过,不开80分,
O(qlog3n)
。
正解是这样的,如果只有一个询问,考虑二分答案k,求出权值大于k的路径的交,若包含要询问的点,说明答案不能够大。问题转化为求权值大于k的路径经过询问点的次数。参考联赛day2T3,若有两条路径
A→B
,把A和B的权值+1,LCA(A,B)和其父亲的权值-1。那么一个点被覆盖的次数就是以这个点为根的子树的权值和。
子树的权值和可以通过DFS序转化成区间和,树状数组维护即可,求LCA可以用O(1)的算法,总复杂度是
O(qlog2n)
,多组询问整体二分即可,复杂度不变,复杂度不变是整体二分的基础,从这里可以归纳出哪些题可以整体二分。
树
应该是一道一眼题。把每次接到大树上的子树看成一个点,把缩点后的大树建出来。如何把大树的编号转化成模板树上的编号?先确定子树,然后求子树第k小,主席树可以搞。
对于每一个询问,如果两个点在同一个大树的节点内,那么在模板树中倍增。
如果两个点在不同的团内,而且两个团的LCA不是任何一个,那么先到团的根,再在大树上倍增,最后减去一段距离即可,自己画图就知道了。
如果两个点在不同的团内,而且两个团的LCA是其中一个,和上面的差不多。
序列
考虑使用莫队,即知道[i,j]的答案怎么快速知道[i,j+1]的答案。
实际上我们就是要统计左端点
∈[i,j]
,右端点是j+1的区间的最小值的和。先找到[i,j+1]的最小值的位置k,那么左端点
∈[i,k]
的答案都是这个最小值。预处理一个s[i]表示左端点
∈[1,i]
右端点是i的区间最小值和,那么之前的[k+1,j+1]的答案就是s[j+1]-s[k],这个应该是显然的,然后就能
O(1)
转移了,其他的转移类似,要记后缀和。总复杂度
O(n1.5)
。比线段树不知道好写好想到哪里去了。
矿区
先建对偶图,每个开采计划肯定对应着一些边,而这一些边围住了一些点,这些点就是要统计答案的地方。我们先搞出对偶图以无穷域为根的生成树,然后记一下每个点为根的子树的两个权值的和。然后找出每个计划对应的边,若这条边是进入子树的则加上答案,否则减去答案,非树边直接忽略。
大数
当p不是2或5时,如果一个子串是[i,j]的倍数,那么[i,n]-[j+1,n]是p的倍数,即[i,n],[j+1,n]modp相等。
问题转化成了,给一个询问[l,r],问有多少对数的后缀modp的值相等。如果我们知道[i,j]的值,很易知道[i,j+1]的值,上莫队即可,
O(n1.5)
。