神奇的部分和

本文分享了一个解决 Codeforces 上 263E 题目的高效方法,通过观察矩阵特征简化计算过程。讨论了如何利用特定矩阵结构快速求解,并提供了旋转矩阵与权值计算的巧妙思路,旨在帮助读者理解并掌握此类问题的解决策略。

今年国家集训队的题目太难了(对于我来说),所以我打算去做去年的。没想到第一题就收获巨大了(对于我来说)。

题目是codeforces上的263E

虽然这题暴力搞搞,弄几个部分和来算也是可以的,但是,显然这样做会非常繁琐。

于是我在提交记录里找到了这样一个神奇的方法。下面就简单记录一下。

看下面那幅图中的下面那幅图(图中图),就是单元格A19:I27。

706716-20151103215245633-1843443955.png

用黑线围住的就是我们要算的那坨东西的形状。假设我们现在要算f(x, y),k=4,这里(x,y)表示的就是F24这个格子。

我们观察一下,每个单元格右下方的所有数字之和,恰好就是该单元格数字乘上的权值(就是题目中的k-|i-x|-|j-x|)。比如说E24,右下角所有数字之和恰好就是3!

有了这个特征,接下来就简单了,代码非常好写。

这里再想想,如果我们乘的权值是1而不是k-|i-x|-|j-x|,我们也可以构造出这种矩阵,这里就是上图中的上面那幅图

这里我们可以用些小技巧来画这个图:

706716-20151103220720102-2146536533.png

当然,如果乘的权值是1,我们还可以把图旋转45度(曼哈顿距离和切比雪夫距离是可以互相转换的,原图中的点\((i,j)\),变为新图的点\((i+j-1, n-i+j)\),图的大小变为\((n+m-1)^2\)),然后就变成算矩形的部分和了。

转载于:https://www.cnblogs.com/wangck/p/4934492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值