我想不出一个好的算法

I can't think of a good algorithm

本文关键字:一个 算法      更新时间:2023-10-16

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

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

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

•ColSet i x:这意味着在执行此操作后,第i列单元格中的所有整数都已更改为x。

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

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

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

输入

第一行输入包含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

行集1 0

ColQuery 1

输出:3

2

0

1

怎么办?时间限制是0.6秒,因此在2D阵列上标记操作的天真算法不起作用。

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

  1. 用铅笔和纸做一个例子
  2. 再举一个例子,这次记下你的每一个详细步骤表演
  3. 使用您的步骤再次运行一个示例。根据需要进行调整
  4. 将步骤转换为代码

使用这种技术,您可以提出更合适的问题来搜索Stackoverflow,例如"我如何实现方形内存/矩阵?"

或者"我如何使用调试器?"

或者"这是一个最小的程序,重现了我的问题……,我做错了什么?"

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

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

让我们从一些小的东西开始,比如4x4矩阵。并使用命令:Set Row 1 0//将Row 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函数来读取命令
运行程序,注意问题所在,例如在运行时可以声明任何大小的矩阵
用于解决问题的外接程序代码
重复

相关文章: