zoukankan      html  css  js  c++  java
  • 神奇的部分和

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

    题目是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)),然后就变成算矩形的部分和了。

  • 相关阅读:
    第一篇代码 嗨翻C语言 21点扑克
    Windows7 sp1 64位下安装配置eclipse+jdk+CDT+minGW
    MinGW-64 安装
    Windows Live Writer配置步骤
    Css 居中
    c++ 常量成员函数
    c/c++ 引用计数
    C++ 《STL源码剖析》学习-vector
    C/C++ 有符号数和无符号数
    cocos2d 内存管理机制
  • 原文地址:https://www.cnblogs.com/wangck/p/4934492.html
Copyright © 2011-2022 走看看