zoukankan      html  css  js  c++  java
  • Codeforeces 954C Matrix Walk

    题目大意

    考虑一个 $x imes y$ 的矩阵 $A_{x imes y}$ ,$A_{i,j} = (i-1)x+y$ 。
    从矩阵中的某个位置出发,每次可向上下左右移动一步,每到一个位置,记录下此位置上的数,如此可得到一个序列。
    现给定序列 $a_1, a_2, dots, a_n$,判断是否存在 $x,y$ 使得在 $A_{x,y}$ 中移动能得到此序列。

    解法

    考察 $|a_{i+1} - a_{i}|$,显然有 $|a_{i+1} - a_i| = 1$ 或 $|a_{i+1} - a_i| = y $ 。
    所以若 $exists i |a_{i+1} - a_{i}| e 1$,则 $y= |a_{i+1} - a_{i}|$ 。

    若按上述必要条件检查不出矛盾,且可确定 $y e 1$,则我们可以确定序列中每个数在矩阵 $A$ 中位置。此时还需进一步检查

    序列中相邻且差的绝对值为 $1$ 的两个数是否在同一行

    若不存在 $|a_{i+1} - a_{i}| e 1$ 的情况,则取 $y=1$ 即可,无需进一步检查。


    我的代码赛后被 Hack 了。我当时想到的是, $y e 1$ 确定以后,还需要检查处在同一行的数不超过 $y$ 个。
    我判断的方法是:检查应在同一行的连续若干个数的最大值和最小值之差是否大于 $y$ 。
    这个想法是有 bug 的。

    我当时没有认识到

    $y$ 确定以后,每个数所在的行列就确定了。

    这是 key observation 。

  • 相关阅读:
    urlencode 和 rawurlencode 的区别
    magic_quotes_gpc
    变量的值是多少
    git diff patch
    drupal前端开发的第一点
    git drupal eclipse
    spm总结
    features block
    alu features menu
    git reset 理解
  • 原文地址:https://www.cnblogs.com/Patt/p/8625587.html
Copyright © 2011-2022 走看看