有一块魔术板。魔术板具有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数组上标记操作的天真算法不会起作用。
答案 0 :(得分:3)
如果你想不出一个好的算法,试试这个技术:
使用这种技术,您可以提出更合适的问题来搜索Stackoverflow,例如“我如何实现内存/矩阵的方形区域?”
或“我如何使用调试器?”
或者“这是重现我的问题的最小程序......,我做错了什么?”
从需求中看,您至少需要两个函数:将行设置为给定值或将列设置为给定值。
让我们从像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
函数以读取命令
运行程序,注意任何问题,例如能够在运行时声明任何大小的矩阵
添加代码以解决问题
重复。