彩色网格算法

时间:2014-07-05 19:48:52

标签: algorithm

我刚刚在网站上遇到了一个问题,我现在正试图解决这个问题。这是问题所在。

  

您将获得一个N×N网格。每个单元格在开头都有白色(颜色0)。

     

每行和每列都有一定的颜色。使用新颜色V填充行或列意味着将该行或列的所有单元格更改为V(从而覆盖单元格的先前颜色)。

     

现在,给定一系列P这样的操作,计算最终网格中颜色的总和。操作可以类似于COL 1 6,意思是填充第1列,同样适用于行。

在我看来相当简单的问题,但我的解决方案似乎并未被接受。显然我错过了一些东西。这是我到目前为止所尝试的内容。 使用false(未填充)为每个行和列初始化一个标志。记录填充的col和行数。现在从最后一个操作开始(从反向开始)。

  

如果它是对列的操作,请检查之前是否先填充了col,即检查该列的标志。如果不是,请检查填充的行数。现在sum = sum + (N - rows_filled) * (Number to be filled in the column).将列的更新标志更改为true表示已填充。增量列填充一个。如果列之前已填充,则继续执行下一步操作。同样的逻辑也适用于行操作。这一直持续到填充的行数=填充的列数= N或直到处理完所有操作。

任何人都可以帮我找出,这个逻辑有什么问题?如果你有更好的方法解决这个问题,也可以分享。

2 个答案:

答案 0 :(得分:2)

问题是Integer只处理32位整数,因此计算溢出。

请注意:

(576055795*10)%2**32 = 1465590654

长处理64位整数,因此工作正常。

答案 1 :(得分:1)

看起来你正在尝试解决HackerRank中的[IOI] Color Grid问题。由于比赛已经结束,我认为讨论解决方案是可以的。

您需要密切关注此问题的约束:

1 <= N <= 6000     # Grid size
1 <= P <= 400000   # Number of paint operations

请注意,P可能比N大很多倍,在这种情况下,几乎所有的绘制操作都会对最终结果产生零影响,因为它们将在后续操作中被绘制。相同的行或列。

如果您尝试计算每项操作的后果,您的代码将在到达解决方案之前超时。相反,你应该专注于忽视没有净效应的操作。

例如,您可以通过记忆在每个行和列上执行的 last 操作来执行此操作,并且仅在耗尽所有输入数据后计算这些操作的效果。

(正如@Peter de Rivaz指出的那样,你必须在64位累加器中加上单元格值以避免溢出。)