【NOIP2015 10.22模拟】总结

概述

这是一套很简单的题目,估计顶多就提高组难度。可是四道题我只做了230多分,特地记录一下这次的经验和教训。

题目简述

T0

题目描述

S 是一个长度至多3000的数组,每个数在 0 9之间。记 Bi,j=sisj ,问 B 有多少个子矩阵的元素和为sum

思路

cntx s 有多少个区间元素和为x。那么答案就是 d|sumcntdcntsumd
要注意如果 sum 是一个完全平方数,则它的平方根只需要算一次而不是两次。之所以其它的约数都被算了两次是因为具有对称性。而一个长宽相等的玩意儿对称过来还是它本身。同理 sum=0 时也要特殊处理一下。

T1

感觉这一场就这一道题有一点点的难度。

题目描述

给出 n×m 的矩阵 A ,记一个r×c的矩阵 M 是酷的,当且仅当M1,1+Mr,cM1,c+Mr,1。称一个矩阵 M 非常酷当且仅当它的每一个大小至少为2×2的子矩阵是酷的。问最大的非常酷子矩阵的大小。

思路

首先将原式移项,发现它的形式十分优美。
M1,1M1,cMr,1Mr,c
既然它要求每一个子矩阵都是酷的,我们不妨先看 2×2 的矩阵。发现它实际上要求的是差分以后,下一行的元素不小于上一行的同位置元素。对于一整段下一行的差分都不小于上一行的差分的序列来说,我们可以发现可以直接推出每一段都是满足酷的条件的。于是这道题思路就很清晰了。求出每一行前一项与后一项的差分以后,求一个满足下面的元素总是大于上面的元素的子矩阵就可以了。

具体做法就是求出差分矩阵 di,j=di,jdi,j+1
然后求出 upx,y 表示从 (x,y) 这个位置向上,经历的元素必须递减,所能到达的最远距离。
然后枚举一行,从左到右扫描。维护一个 up 值单调递增的栈,那么对于一个特定的 up 值,它需要被统计答案的时候当且仅当它从栈中弹出,或者整一行都被扫描完还在栈中的时候。分别计算一下就可以得到答案了。

T2

我一开始认为这就是一个裸的prim,而且我自认为这道题不好写对拍就没写,结果挂在这一题上了。

题目描述

给出一幅无向图,其中有的是黑点,有的是白点。要求选出一些边,使得任意一个白点可以通过这些边到达某个黑点,并且这个黑点在原图中与这个白点是最靠近的。

思路

首先这个题目和prim算法是很相像的,但这里有个不同的地方就是要求到达的黑点是在原图中最靠近这个白点的。那么这里只需要多跑一个最短路,然后在加边时加一个约束条件就可以了。
实际上我们算出每个点的最短路后只需要选一条在最短路上的最短的出边连上就可以了。

T3

这题就是个裸的DP,但是我写错了。
感觉DP什么的总是写不好,要好好考虑下。
题意题解什么的就不写了,真的很裸。
这道题错的地方有两个

  • 题目要求右旋,写成了左旋。样例通过了,对拍写的也是左旋的写法。
  • 输出方案时,往回跳时本该采用 prei+1,pos 的值,但我想当然地写成了 prei,pos
    而这个问题我拍出来了。但我怀疑的是对拍写错了,而不是我程序本身的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值