C++ 我能';我想不出一个好的算法

C++ 我能';我想不出一个好的算法,c++,C++,有一个魔术板。魔术板有N*N个单元格:N行和N列。每个单元格包含一个整数,最初为0。让行和列的编号从1到N 有两种类型的操作可应用于魔术板: •行集i x:这意味着在执行此操作后,行i上单元格中的所有整数都已更改为x •ColSet i x:这意味着在此操作后,列i上单元格中的所有整数都已更改为x 您的朋友有时对某行或某列上的整数0的总数感兴趣: •行查询i:这意味着您应该回答第i行的0总数 •ColQuery i:这意味着您应该回答第i列上0的总数 输入 第一行输入包含两个空格分隔的整数N和Q

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

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

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

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

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

•行查询i:这意味着您应该回答第i行的0总数

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

输入

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

然后,接下来的每一行都包含一个操作或一个按照上述格式进行的查询

输出

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

约束条件

一,≤ N、 Q≤ 500000(5*105)

一,≤ 我≤ N

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

样本输入:

36

行查询1

ColSet 1

行查询1

查询1

行集10

查询1

输出: 三,

二,

0

一,


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

如果您想不出一个好的算法,请尝试以下技术:

  • 使用铅笔和图表纸运行一个示例
  • 再次运行一个示例,这次写下您需要的每个详细步骤 表演
  • 使用步骤再次运行示例。根据需要进行调整
  • 将步骤转换为代码
  • 使用此技术,您可以提出更合适的问题来搜索Stackoverflow,例如“如何实现内存/矩阵的平方面积?”

    或“如何使用调试器?”

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

    编辑1:(提升我的S.O.声誉) 从需求来看,您至少需要两个函数:将行设置为给定值或将列设置为给定值

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

    查看上面的代码,我们可以注意到一种模式,即列索引每次都在变化,变化幅度为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;
      }
    
    通过提供函数签名,我们可以将其转换为独立函数:

    void Set_Row(unsigned int& array[4][4],
                 unsigned int  row,
                 unsigned int  value)
    {
       // Insert above code fragment here.
    }
    
    接下来,为其他命令生成函数。
    创建一个
    main
    函数来读取命令。
    运行该程序,注意任何问题所在,例如能够在运行时声明任何大小的矩阵。
    添加代码以解决问题。

    重复。

    您是否刚刚将一个完整的未格式化的家庭作业问题发布到stackoverflow 0\o?请阅读常见问题。在stackoverflow中,这个问题太本地化了,无法提问,它不是您面临的一般或有趣的编程问题,它只是您简单的CS101作业。除了寻求帮助之外,您不会什么都不做。您不会。是的,而且看起来很有效。这不是家庭作业问题!如果这个答案对你有帮助的话,记得检查一下。你真的认为对于给定的数据范围,这个答案会在0.6秒的时间限制下吗?这是一个幼稚的算法,我已经想到了,并拒绝了。所以,这是行不通的。谢谢。你在你的帖子里说:1。0.6秒的时间限制,并且您已经实现了一个算法?
    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.
    }