您的位置:首页 > 其它

jzoj 2016.12.31 noip模拟赛A 总结

2016-12-31 16:17 204 查看
终于不是爆零选手了!

思维还是辣鸡,第二题与第四题的方法都是能想到的

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,不需要打链表这么麻烦了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: