终于不是爆零选手了!
思维还是辣鸡,第二题与第四题的方法都是能想到的
T1
一个n*m平面,求用A..Z组成的正方形完整覆盖的最小字典序方案。要求颜色相同的正方形不能相邻。
根据字典序,应当想到当前位置必须最优。
所以就能A..D按顺序枚举就可以了,注意需要扩展的时候(可以接上一个放的)
为什么是A..D?“四色定理”
其实直接A..Z也行。
比赛的时候,扩展忘了判断相邻条件,于是就40分GG。
T2
看错题++
给一个N <= 500的图,求在两点最短路径上的边有多少条。
很熟悉,一开始对着一个floyed想了好久,发现好像搞不出来。
打着打着30分暴力就想到了n^4的方法。
暴力枚举一个点对与边,判断该边在不在最短路径上,通过floyed出来的距离可以做到。
强烈吐槽数据:捆绑数据+出错(m=20却只给了19条边),30分没了
正解
不难想到n^4的方法,我们用点覆盖边的方法将枚举边变成枚举一个中间点,利用一个sum数组计算该点新增的答案。这样就可以降到n^3。
T3
一个n*m的环面,(x,1)可以走到(x,m),给出K个有序的操作,每个操作在一个点放上障碍物,求使得“从第一行走到最后一行有路径 ”满足的操作个数。
即求放下去会让条件不满足的操作个数,且这样的操作我们不执行。
并查集想了很久,也没有什么思路。只会nmk的30分暴力
比赛的时候在死扣第二题,没有打。(也没人打对。。)
正解
事实证明我并查集想反了,我们完全可以维护障碍物的八连通集合。
首先考虑没有环的情况。直接与周围八个点合并,如果这个集合中最左与最右分别在1与m,那么说明无法走通。
但是这个思路对环完全行不通,不难举出反例。
我们先把他复制一遍,这是对环的套路。
然后,对于一个操作(x,y),拆成(x,y)与(x,m+y)
若这两个点与周围集合 合并后连通,那么由”对称”性得,[m+1..m+y]这个区间应与[1..y]相同。就变成了没有环的情况,说明会锁死。
还有越界的情况 待续(不会)..
T4
求最小最值差生成树
经典问题,但是比赛只会60分的做法。
枚举最小边,然后用剩下的边做一次最小生成树 M^2。
比赛的时候想到lct,但是无奈辣鸡不会打。。
正解
我们不需要对于每一个最小边都做一遍最小生成树,只要我们能维护加边减边。
显然这是link-cut tree的功能。然而有更方便的做法。
先把边从大到小排个序,去维护当前生成树的每个节点树上父亲。
我们将边逐条加入,这样保证最小边为当前加入的边.
假如当前边(a,b)不在同一个集合内,那么直接连接(要将一边的树旋转换根,然后再连上另一边,这个可以通过一个father数组O(n)实现)。
假如当前边(a,b)在同一个集合内,那么我们类暴力lca的做法O(n)求一下环内最大边,替换掉(同上旋转连接)必然是以当前边为最小边的最优方案。
为什么是最优的?
假如之前的方案是最优的,然后我们考虑加一个最小边。
要使生成树依旧成立,要保持原图的连通性。这样我们就只关心这个环内边的删减。
显然只能删一条边,因为最优生成树的边数必定是n-1,多余边对答案只有负贡献。
所以必定是在环中删掉一条最大边,这样可以得出以当前边为最小的最优方案。
然后归纳就不难证明了。
不要相信直觉
然后O(n)暴力求所有边的max与min,不需要打链表这么麻烦了。