神奇的部分和
2015-11-03 22:11
239 查看
今年国家集训队的题目太难了(对于我来说),所以我打算去做去年的。没想到第一题就收获巨大了(对于我来说)。
题目是codeforces上的263E。
虽然这题暴力搞搞,弄几个部分和来算也是可以的,但是,显然这样做会非常繁琐。
于是我在提交记录里找到了这样一个神奇的方法。下面就简单记录一下。
看下面那幅图中的下面那幅图(图中图),就是单元格A19:I27。
用黑线围住的就是我们要算的那坨东西的形状。假设我们现在要算f(x, y),k=4,这里(x,y)表示的就是F24这个格子。
我们观察一下,每个单元格右下方的所有数字之和,恰好就是该单元格数字乘上的权值(就是题目中的k-|i-x|-|j-x|)。比如说E24,右下角所有数字之和恰好就是3!
有了这个特征,接下来就简单了,代码非常好写。
这里再想想,如果我们乘的权值是1而不是k-|i-x|-|j-x|,我们也可以构造出这种矩阵,这里就是上图中的上面那幅图。
这里我们可以用些小技巧来画这个图:
当然,如果乘的权值是1,我们还可以把图旋转45度(曼哈顿距离和切比雪夫距离是可以互相转换的,原图中的点\((i,j)\),变为新图的点\((i+j-1, n-i+j)\),图的大小变为\((n+m-1)^2\)),然后就变成算矩形的部分和了。
题目是codeforces上的263E。
虽然这题暴力搞搞,弄几个部分和来算也是可以的,但是,显然这样做会非常繁琐。
于是我在提交记录里找到了这样一个神奇的方法。下面就简单记录一下。
看下面那幅图中的下面那幅图(图中图),就是单元格A19:I27。
用黑线围住的就是我们要算的那坨东西的形状。假设我们现在要算f(x, y),k=4,这里(x,y)表示的就是F24这个格子。
我们观察一下,每个单元格右下方的所有数字之和,恰好就是该单元格数字乘上的权值(就是题目中的k-|i-x|-|j-x|)。比如说E24,右下角所有数字之和恰好就是3!
有了这个特征,接下来就简单了,代码非常好写。
这里再想想,如果我们乘的权值是1而不是k-|i-x|-|j-x|,我们也可以构造出这种矩阵,这里就是上图中的上面那幅图。
这里我们可以用些小技巧来画这个图:
当然,如果乘的权值是1,我们还可以把图旋转45度(曼哈顿距离和切比雪夫距离是可以互相转换的,原图中的点\((i,j)\),变为新图的点\((i+j-1, n-i+j)\),图的大小变为\((n+m-1)^2\)),然后就变成算矩形的部分和了。
相关文章推荐
- [转]数据库物化视图刷新SQL命令和查询被delete掉的数据
- JVM垃圾回收日志结构分析
- 求i<j<p<q w[i]×w[p]=w[j]×w[q]总数 STL map SRM 671 div1 500: BearDarts
- mongodb mongod 启动参数
- Hadoop---安装thrift
- iOS字符串处理_替换(去掉空格换行)、截取
- 解决confluence的乱码问题
- Add Binary
- JavaWEB_Tomcat安装与配置(J2EE Eclipse)
- 基于对话框的MFC应用程序实现菜单的勾选功能
- POJ 3746 Teacher YYF (打表)
- UIImageView不能设置圆角的解决方法
- 在Maven中新增自定的jar包
- 安装apache+php+mysql
- 常用数据库字符串处理函数举例
- 锋利的jQuery--jQuery事件,动画(读书笔记二)
- Android中的OptionsMenu,ContextMenu,pupMenu例子
- Linux渗透+SSH内网转发
- ZOJ 3635 Cinema in Akiba【线段树】
- Linux渗透+SSH内网转发