HNOI2016题解

最小公倍数

考虑暴力做法,对于每一个询问,暴力加入满足询问的边,然后维护联通性和maxa,b,如果满足条件则YES。
两个条件的限制似乎很难用别的数据结构优化掉,那么考虑分块,先以a为第一关键字,b为第二关键字排序,每 m0.5 分成一块。然后把每一个询问归类到相应的块中,使得这个询问的a大于等于块的a最小值小于等于最大值。
依次扫每个块,把每个块的询问取出来。设当前的块号是 i ,那么我们把1到i-1的块里面的所有的边按b排序,再把这个块内的询问按b排序。然后扫1到i-1的符合当前询问的边,加入并查集。对于i块内的边,只能暴力扫然后加入并查集了,注意处理完这个询问后,要撤销掉在该块内加入的边。所以此题的并查集不能路径压缩,要用启发式合并或按秩合并,两者都是 logn 的,总的时间复杂度时 O(n1.5logn)

网络

考虑暴力做法,先树链剖分,线段树的每个点维护一个可重set表示不经过这个区间的权值集合,因为整棵树的DFS序是连续的,加入一条链时,会被影响到的区间有log个,相当于在一个木棍上砍log刀,剩下的部分还是log的,然后线段树暴力打标记即可,开O2可过,不开80分, O(qlog3n)
正解是这样的,如果只有一个询问,考虑二分答案k,求出权值大于k的路径的交,若包含要询问的点,说明答案不能够大。问题转化为求权值大于k的路径经过询问点的次数。参考联赛day2T3,若有两条路径 AB ,把A和B的权值+1,LCA(A,B)和其父亲的权值-1。那么一个点被覆盖的次数就是以这个点为根的子树的权值和。
子树的权值和可以通过DFS序转化成区间和,树状数组维护即可,求LCA可以用O(1)的算法,总复杂度是 Oqlog2n) ,多组询问整体二分即可,复杂度不变,复杂度不变是整体二分的基础,从这里可以归纳出哪些题可以整体二分。

应该是一道一眼题。把每次接到大树上的子树看成一个点,把缩点后的大树建出来。如何把大树的编号转化成模板树上的编号?先确定子树,然后求子树第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)

你可能感兴趣的:(考试总结,BZOJ)