假设我们有一个包含所有初始值arr
的数组0
。现在我们获得n
次操作 - 一个操作由两个数字a b
组成。这意味着我们将+1
添加到arr[a]
的值,并将-1
添加到arr[b]
的值。
此外,我们可以在某些操作中交换数字,这意味着我们会将-1
添加到arr[a]
和+1
添加到arr[b]
。
我们希望实现一种情况,即使在所有这些操作之后,arr
的所有值都等于0
。我们想知道这是否可能,如果是的话,我们应该交换哪些操作来实现这一目标。
有什么想法吗? 一些示例输入:
3
1 2
3 2
3 1
应该导致
YES
R
N
R
其中R
表示撤消该操作,N
不执行此操作。
输入:
3
1 2
2 3
3 2
得到答案NO
。
答案 0 :(得分:1)
让每个数组元素成为图形中的顶点,操作(a,b)
是从顶点a
到b
的边(相同顶点之间可能有多条边)。现在从顶点a
出发意味着减少数组元素a
并前往顶点a
意味着增加数组元素a
。现在,如果每个顶点具有偶数个边,并且您找到一个循环路径,一旦您在数组中的总和为零,就会完全访问每个边。
这样的路径称为Eulerian cycle(维基百科)。来自维基百科:当且仅当每个顶点具有偶数度时,无向图具有欧拉循环,并且其具有非零度的所有顶点都属于单个连通分量。在您的情况下,只有所有断开连接的子图需要有一个欧拉循环,它足以计算每个数组索引出现的次数,如果每个数组的计数均匀,则始终有方法在数组中获得零总数
如果要查找要反转的操作,则需要找到其中一条路径,并检查边缘行进的方向。
答案 1 :(得分:0)
只计算指数出现的次数。如果所有索引都以偶数显示,则答案为是。
你可以通过施工证明。您需要从原始配对列表中构建配对列表。目标是构建列表,以便您可以匹配左侧显示的每个索引和右侧显示的索引。
从第一对到最后一对。对于每对,尝试匹配出现奇数次数的索引。
例如,在第一个示例中,每个索引都出现两次,因此答案为YES。要构建列表,请从(1,2)开始。然后你看一对(3,2)并且你知道右边出现一次,所以你把它换成左边的2 :( 2,3)。对于最后一对,你有(3,1)匹配1和3,目前只出现一次。
请注意,最后,您始终可以找到匹配的对,因为每个数字都以偶数显示。每个号码都应该匹配。
在第二个例子中,2出现了三次。所以答案是否定的。