我想不出一个好算法

时间:2013-02-06 23:58:25

标签: c++

有一块魔术板。魔术板具有N * N个单元:N行和N列。每个单元格包含一个整数,最初为0。让行和列的编号从1到N.

有两种类型的操作可以应用于魔术板:

•RowSet i x:表示在此操作后,第i行单元格中的所有整数都已更改为x。

•ColSet i x:表示在此操作后,第i列单元格中的所有整数都已更改为x。

您的朋友有时会对某行或列上的整数0的总数感兴趣:

•RowQuery i:这意味着你应该回答第i行的总数。

•ColQuery i:这意味着您应该回答第i列的总数。

输入

第一行输入包含2个以空格分隔的整数N和Q.它们表示魔术板的大小,以及来自朋友的操作和查询总数。

然后,每个下一个Q行包含上述格式的操作或查询。

输出

对于每个查询,输出查询的答案。

约束

1≤N,Q≤500000(5 * 105)

1≤i≤N

x∈{0,1}(即,x = 0或1)

示例输入:

3 6

RowQuery 1

ColSet 1 1

RowQuery 1

ColQuery 1

RowSet 1 0

ColQuery 1

输出: 3

2

0

1

如何去做?时间约束是0.6秒,因此在2D数组上标记操作的天真算法不会起作用。

1 个答案:

答案 0 :(得分:3)

如果你想不出一个好的算法,试试这个技术:

  1. 使用铅笔和方格纸运行示例。
  2. 再次运行一个例子,这次写下你的每一个详细步骤 执行。
  3. 使用您的步骤再次运行示例。根据需要进行调整。
  4. 将您的步骤转换为代码。
  5. 使用这种技术,您可以提出更合适的问题来搜索Stackoverflow,例如“我如何实现内存/矩阵的方形区域?”

    或“我如何使用调试器?”

    或者“这是重现我的问题的最小程序......,我做错了什么?”

    编辑1 :(提升我的S.O.声誉)

    从需求中看,您至少需要两个函数:将行设置为给定值或将列设置为给定值。

    让我们从像4x4矩阵这样小的东西开始。 并使用命令:设置行1 0 //将行1设置为全零。 请记住,C ++从0到N-1索引而不是1到N,因此我们必须从行号中减去一个。 让我们使用符号:board[row][column]来表示板上的单元格。 手工:

      board[0][0] = 0;
      board[0][1] = 0; // Note the incrementing column numbers.
      board[0][2] = 0;
      board[0][3] = 0; // Note the last column index is 3 not 4.
    

    看看上面的代码,我们可以注意到一个模式,即列索引每次都会改变1.所以我们可以把它放到一个循环中:

      Set column to zero.
      While column is less than 4 do:
          board[0][column] = 0;
          column = column + 1;
          end-while
    

    下一步是将其变成一些代码:

      unsigned int column;
      unsigned int board[4][4];
      for (column = 0; column < 4; ++column)
      {
           board[0][column] = 0;
      }
    

    由于Set Row命令允许变量行索引和变量行值,我们创建这些变量并将它们插入到我们的代码中:

    unsigned int row = 0;
    unsigned int value = 0;
    unsigned int column;
    unsigned int board[4][4];
    for (column = 1; column < 4; ++column)
    {
        board[row][column] = value;
    }
    

    我们可以通过提供功能签名使其成为一个独立的功能:

    void Set_Row(unsigned int& array[4][4],
                 unsigned int  row,
                 unsigned int  value)
    {
       // Insert above code fragment here.
    }
    

    接下来,为其他命令创建函数 创建main函数以读取命令 运行程序,注意任何问题,例如能够在运行时声明任何大小的矩阵 添加代码以解决问题 重复。