我想不出一个好的算法
I can't think of a good algorithm
有一块魔法板。魔法板有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阵列上标记操作的天真算法不起作用。
如果你想不出一个好的算法,试试这个技术:
- 用铅笔和纸做一个例子
- 再举一个例子,这次记下你的每一个详细步骤表演
- 使用您的步骤再次运行一个示例。根据需要进行调整
- 将步骤转换为代码
使用这种技术,您可以提出更合适的问题来搜索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
函数来读取命令
运行程序,注意问题所在,例如在运行时可以声明任何大小的矩阵
用于解决问题的外接程序代码
重复
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 一个有效的图算法,满足以下条件
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- 并行算法将向量的元素分配到另一个元素的元素
- STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端
- 更好的算法来检查一个数字是否既不是素数也不是单个素数的幂
- C++:一个算法的实现
- 我正在尝试为 Kruskal 算法实现一个C++程序,该程序需要我按权重对图形进行排序。如何按权重对结构进行排序
- 对于这个特定用例来说,一个很好的排序算法
- 需要一个高效的减法算法取模一个数字
- 需要一个好的算法来对8GB的图片进行分类
- 我需要一个测试案例来证明我的算法/代码错误
- 在C 中编写一个简单的排序算法以及伪代码版本
- 有没有一个带有距离标记的最短路径算法的开源实现
- 建议一个合适的算法来合并包含类对象的两个数组(不重复)
- 在正方形矩阵中,每个单元格都是黑色或白色.设计了一个算法来寻找最大白色子平方
- 给定一个二叉树,设计一个算法,创建每个深度的所有节点的链表
- 创建一个算法,要求用户输入两个正数,将它们称为 "first" 和 "last" ,并打印第一个正数之间的所有数字的总和
- 寻找一个算法/类计数IP地址(直方图)
- 这是一个O(n)算法吗?