jzoj 2016.12.31 noip模拟赛A 总结

53 篇文章 0 订阅

终于不是爆零选手了!
思维还是辣鸡,第二题与第四题的方法都是能想到的

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,不需要打链表这么麻烦了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值