首先,这道题非常简单,但大量的提交过不了,我也是,折腾了2天,最后看其他人的通过题解,才发现问题。
题目的两个操作:P x;Q x ;
Q x 是虚拟打开直到看到x要多少步;
P x 是打开到看到x要多少步。
注意,P x操作之后,会顺手把x也打开;许多提交答案差1就是没有P x之后,将x也设置为打开(但很奇怪,打开x不占用打开步骤)。
正式的做法:
先建树,然后获取每个节点的倍增祖先。
优化:我们可以维护一个 布尔 数组open,用来描述第i个娃娃是否已经被打开。如果已经被打开,则i的孩子节点都是可见的,这样可以避免删边操作。
重点注意:当执行P x之后,需要把 open[x] = true,来表示x已经打开(感觉这个是题目没说清楚)。我失败的提交,都是 P x操作,只有状态 open[father[x][0]] = true;
如果P x,之后看x的孩子,需要的打开步数是1,则题目的测试数据有问题;否则就是这个歧义的规则,P x会打开x,且不算打开步骤。
希望洛谷的管理人员,能审核一下这个测试数据。看看是否是测试数据错误,导致正确的提交过不了,错误的提交才能过。
个人读题,倾向于P x表示把x放到桌面上,但并不打开。即假设y是x的孩子,P x 之后,Q y为1;测试数据中,P x之后,Q y为0;
构造测试数据:
3 2
3 2
2 1
P 2
Q 1
测试数据的答案是:
1
0
我认为正确的答案是:
1
1